diff --git a/.hgignore b/.hgignore index 4a0311dcc..125eff13c 100644 --- a/.hgignore +++ b/.hgignore @@ -206,3 +206,5 @@ code/ryzom/server/src/ryzom_admin_service/ryzom_admin_service code/ryzom/server/src/ryzom_naming_service/ryzom_naming_service code/ryzom/server/src/ryzom_welcome_service/ryzom_welcome_service code/ryzom/server/src/tick_service/tick_service +# WebTT temp dir +code/ryzom/tools/server/www/webtt/app/tmp diff --git a/code/ryzom/tools/server/www/webtt/.gitignore b/code/ryzom/tools/server/www/webtt/.gitignore new file mode 100644 index 000000000..9edf61016 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/.gitignore @@ -0,0 +1,4 @@ +/app/config +/app/tmp +/plugins +/vendors \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/.htaccess b/code/ryzom/tools/server/www/webtt/.htaccess new file mode 100644 index 000000000..f23dbaf66 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine on + RewriteRule ^$ app/webroot/ [L] + RewriteRule (.*) app/webroot/$1 [L] + \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/README b/code/ryzom/tools/server/www/webtt/README new file mode 100644 index 000000000..ddf42020f --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/README @@ -0,0 +1,28 @@ +CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Active Record, Association Data Mapping, Front Controller and MVC. Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility. + +The Cake Software Foundation - promoting development related to CakePHP +http://cakefoundation.org/ + +CakePHP - the rapid development PHP framework +http://www.cakephp.org + +Cookbook - user documentation for learning about CakePHP +http://book.cakephp.org + +API - quick reference to CakePHP +http://api.cakephp.org + +The Bakery - everything CakePHP +http://bakery.cakephp.org + +The Show - live and archived podcasts about CakePHP and more +http://live.cakephp.org + +CakePHP TV - screen casts from events and video tutorials +http://tv.cakephp.org + +CakePHP Google Group - community mailing list and forum +http://groups.google.com/group/cake-php + +#cakephp on irc.freenode.net - chat with CakePHP developers +irc://irc.freenode.net/cakephp diff --git a/code/ryzom/tools/server/www/webtt/app/.htaccess b/code/ryzom/tools/server/www/webtt/app/.htaccess new file mode 100644 index 000000000..0ed8662ea --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine on + RewriteRule ^$ webroot/ [L] + RewriteRule (.*) webroot/$1 [L] + \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/config/acl.ini.php b/code/ryzom/tools/server/www/webtt/app/config/acl.ini.php new file mode 100644 index 000000000..0907fbd4d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/acl.ini.php @@ -0,0 +1,70 @@ +; +; SVN FILE: $Id$ +;/** +; * ACL configuration +; * +; * +; * PHP versions 4 and 5 +; * +; * CakePHP(tm) : Rapid Development Framework http://cakephp.org +; * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +; * +; * Licensed under The MIT License +; * Redistributions of files must retain the above copyright notice. +; * +; * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +; * @link http://cakephp.org CakePHP(tm) Project +; * @package cake +; * @subpackage cake.app.config +; * @since CakePHP(tm) v 0.10.0.1076 +; * @license MIT License (http://www.opensource.org/licenses/mit-license.php) +; */ + +; acl.ini.php - Cake ACL Configuration +; --------------------------------------------------------------------- +; Use this file to specify user permissions. +; aco = access control object (something in your application) +; aro = access request object (something requesting access) +; +; User records are added as follows: +; +; [uid] +; groups = group1, group2, group3 +; allow = aco1, aco2, aco3 +; deny = aco4, aco5, aco6 +; +; Group records are added in a similar manner: +; +; [gid] +; allow = aco1, aco2, aco3 +; deny = aco4, aco5, aco6 +; +; The allow, deny, and groups sections are all optional. +; NOTE: groups names *cannot* ever be the same as usernames! +; +; ACL permissions are checked in the following order: +; 1. Check for user denies (and DENY if specified) +; 2. Check for user allows (and ALLOW if specified) +; 3. Gather user's groups +; 4. Check group denies (and DENY if specified) +; 5. Check group allows (and ALLOW if specified) +; 6. If no aro, aco, or group information is found, DENY +; +; --------------------------------------------------------------------- + +;------------------------------------- +;Users +;------------------------------------- + +[username-goes-here] +groups = group1, group2 +deny = aco1, aco2 +allow = aco3, aco4 + +;------------------------------------- +;Groups +;------------------------------------- + +[groupname-goes-here] +deny = aco5, aco6 +allow = aco7, aco8 \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/config/bootstrap.php b/code/ryzom/tools/server/www/webtt/app/config/bootstrap.php new file mode 100644 index 000000000..51c786373 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/bootstrap.php @@ -0,0 +1,50 @@ + array('/full/path/to/plugins/', '/next/full/path/to/plugins/'), + * 'models' => array('/full/path/to/models/', '/next/full/path/to/models/'), + * 'views' => array('/full/path/to/views/', '/next/full/path/to/views/'), + * 'controllers' => array('/full/path/to/controllers/', '/next/full/path/to/controllers/'), + * 'datasources' => array('/full/path/to/datasources/', '/next/full/path/to/datasources/'), + * 'behaviors' => array('/full/path/to/behaviors/', '/next/full/path/to/behaviors/'), + * 'components' => array('/full/path/to/components/', '/next/full/path/to/components/'), + * 'helpers' => array('/full/path/to/helpers/', '/next/full/path/to/helpers/'), + * 'vendors' => array('/full/path/to/vendors/', '/next/full/path/to/vendors/'), + * 'shells' => array('/full/path/to/shells/', '/next/full/path/to/shells/'), + * 'locales' => array('/full/path/to/locale/', '/next/full/path/to/locale/') + * )); + * + */ + +/** + * As of 1.3, additional rules for the inflector are added below + * + * Inflector::rules('singular', array('rules' => array(), 'irregular' => array(), 'uninflected' => array())); + * Inflector::rules('plural', array('rules' => array(), 'irregular' => array(), 'uninflected' => array())); + * + */ diff --git a/code/ryzom/tools/server/www/webtt/app/config/core.php b/code/ryzom/tools/server/www/webtt/app/config/core.php new file mode 100644 index 000000000..6bd8d65c6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/core.php @@ -0,0 +1,304 @@ +cacheAction = true. + * + */ + //Configure::write('Cache.check', true); + +/** + * Defines the default error type when using the log() function. Used for + * differentiating error logging and debugging. Currently PHP supports LOG_DEBUG. + */ + define('LOG_ERROR', 2); + +/** + * The preferred session handling method. Valid values: + * + * 'php' Uses settings defined in your php.ini. + * 'cake' Saves session files in CakePHP's /tmp directory. + * 'database' Uses CakePHP's database sessions. + * + * To define a custom session handler, save it at /app/config/.php. + * Set the value of 'Session.save' to to utilize it in CakePHP. + * + * To use database sessions, run the app/config/schema/sessions.php schema using + * the cake shell command: cake schema create Sessions + * + */ + Configure::write('Session.save', 'php'); + +/** + * The model name to be used for the session model. + * + * 'Session.save' must be set to 'database' in order to utilize this constant. + * + * The model name set here should *not* be used elsewhere in your application. + */ + //Configure::write('Session.model', 'Session'); + +/** + * The name of the table used to store CakePHP database sessions. + * + * 'Session.save' must be set to 'database' in order to utilize this constant. + * + * The table name set here should *not* include any table prefix defined elsewhere. + * + * Please note that if you set a value for Session.model (above), any value set for + * Session.table will be ignored. + * + * [Note: Session.table is deprecated as of CakePHP 1.3] + */ + //Configure::write('Session.table', 'cake_sessions'); + +/** + * The DATABASE_CONFIG::$var to use for database session handling. + * + * 'Session.save' must be set to 'database' in order to utilize this constant. + */ + //Configure::write('Session.database', 'default'); + +/** + * The name of CakePHP's session cookie. + * + * Note the guidelines for Session names states: "The session name references + * the session id in cookies and URLs. It should contain only alphanumeric + * characters." + * @link http://php.net/session_name + */ + Configure::write('Session.cookie', 'CAKEPHP'); + +/** + * Session time out time (in seconds). + * Actual value depends on 'Security.level' setting. + */ + Configure::write('Session.timeout', '120'); + +/** + * If set to false, sessions are not automatically started. + */ + Configure::write('Session.start', true); + +/** + * When set to false, HTTP_USER_AGENT will not be checked + * in the session. You might want to set the value to false, when dealing with + * older versions of IE, Chrome Frame or certain web-browsing devices and AJAX + */ + Configure::write('Session.checkAgent', true); + +/** + * The level of CakePHP security. The session timeout time defined + * in 'Session.timeout' is multiplied according to the settings here. + * Valid values: + * + * 'high' Session timeout in 'Session.timeout' x 10 + * 'medium' Session timeout in 'Session.timeout' x 100 + * 'low' Session timeout in 'Session.timeout' x 300 + * + * CakePHP session IDs are also regenerated between requests if + * 'Security.level' is set to 'high'. + */ + Configure::write('Security.level', 'medium'); + +/** + * A random string used in security hashing methods. + */ + Configure::write('Security.salt', '3928c5uM398u4R39m4u8c3m493U49'); + +/** + * A random numeric string (digits only) used to encrypt/decrypt strings. + */ + Configure::write('Security.cipherSeed', '849713027853098175087095830289'); + +/** + * Apply timestamps with the last modified time to static assets (js, css, images). + * Will append a querystring parameter containing the time the file was modified. This is + * useful for invalidating browser caches. + * + * Set to `true` to apply timestamps, when debug = 0, or set to 'force' to always enable + * timestamping. + */ + //Configure::write('Asset.timestamp', true); +/** + * Compress CSS output by removing comments, whitespace, repeating tags, etc. + * This requires a/var/cache directory to be writable by the web server for caching. + * and /vendors/csspp/csspp.php + * + * To use, prefix the CSS link URL with '/ccss/' instead of '/css/' or use HtmlHelper::css(). + */ + //Configure::write('Asset.filter.css', 'css.php'); + +/** + * Plug in your own custom JavaScript compressor by dropping a script in your webroot to handle the + * output, and setting the config below to the name of the script. + * + * To use, prefix your JavaScript link URLs with '/cjs/' instead of '/js/' or use JavaScriptHelper::link(). + */ + //Configure::write('Asset.filter.js', 'custom_javascript_output_filter.php'); + +/** + * The classname and database used in CakePHP's + * access control lists. + */ + Configure::write('Acl.classname', 'DbAcl'); + Configure::write('Acl.database', 'default'); + +/** + * If you are on PHP 5.3 uncomment this line and correct your server timezone + * to fix the date & time related errors. + */ + //date_default_timezone_set('UTC'); + +/** + * + * Cache Engine Configuration + * Default settings provided below + * + * File storage engine. + * + * Cache::config('default', array( + * 'engine' => 'File', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'path' => CACHE, //[optional] use system tmp directory - remember to use absolute path + * 'prefix' => 'cake_', //[optional] prefix every cache file with this string + * 'lock' => false, //[optional] use file locking + * 'serialize' => true, [optional] + * )); + * + * + * APC (http://pecl.php.net/package/APC) + * + * Cache::config('default', array( + * 'engine' => 'Apc', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string + * )); + * + * Xcache (http://xcache.lighttpd.net/) + * + * Cache::config('default', array( + * 'engine' => 'Xcache', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string + * 'user' => 'user', //user from xcache.admin.user settings + * 'password' => 'password', //plaintext password (xcache.admin.pass) + * )); + * + * + * Memcache (http://www.danga.com/memcached/) + * + * Cache::config('default', array( + * 'engine' => 'Memcache', //[required] + * 'duration'=> 3600, //[optional] + * 'probability'=> 100, //[optional] + * 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string + * 'servers' => array( + * '127.0.0.1:11211' // localhost, default port 11211 + * ), //[optional] + * 'compress' => false, // [optional] compress data in Memcache (slower, but uses less memory) + * 'persistent' => true, // [optional] set this to false for non-persistent connections + * )); + * + */ + Cache::config('default', array('engine' => 'File')); diff --git a/code/ryzom/tools/server/www/webtt/app/config/database.php b/code/ryzom/tools/server/www/webtt/app/config/database.php new file mode 100644 index 000000000..a4183b950 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/database.php @@ -0,0 +1,21 @@ + 'mysqli', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'webtt', + 'password' => 'webtt77', + 'database' => 'webtt2', + 'encoding' => 'utf8' + ); + var $raw_files = array( + 'datasource' => 'RawFilesSource', + 'path' => '/home/kaczorek/projects/webtt/distfiles/translation', + 'extension' => '(uxt|txt)', + 'readonly' => true, + 'recursive' => true, + ); +} +?> \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/config/database.php.default b/code/ryzom/tools/server/www/webtt/app/config/database.php.default new file mode 100644 index 000000000..043ba5ccc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/database.php.default @@ -0,0 +1,95 @@ + The name of a supported driver; valid options are as follows: + * mysql - MySQL 4 & 5, + * mysqli - MySQL 4 & 5 Improved Interface (PHP5 only), + * sqlite - SQLite (PHP5 only), + * postgres - PostgreSQL 7 and higher, + * mssql - Microsoft SQL Server 2000 and higher, + * db2 - IBM DB2, Cloudscape, and Apache Derby (http://php.net/ibm-db2) + * oracle - Oracle 8 and higher + * firebird - Firebird/Interbase + * sybase - Sybase ASE + * adodb-[drivername] - ADOdb interface wrapper (see below), + * odbc - ODBC DBO driver + * + * You can add custom database drivers (or override existing drivers) by adding the + * appropriate file to app/models/datasources/dbo. Drivers should be named 'dbo_x.php', + * where 'x' is the name of the database. + * + * persistent => true / false + * Determines whether or not the database should use a persistent connection + * + * connect => + * ADOdb set the connect to one of these + * (http://phplens.com/adodb/supported.databases.html) and + * append it '|p' for persistent connection. (mssql|p for example, or just mssql for not persistent) + * For all other databases, this setting is deprecated. + * + * host => + * the host you connect to the database. To add a socket or port number, use 'port' => # + * + * prefix => + * Uses the given prefix for all the tables in this database. This setting can be overridden + * on a per-table basis with the Model::$tablePrefix property. + * + * schema => + * For Postgres and DB2, specifies which schema you would like to use the tables in. Postgres defaults to + * 'public', DB2 defaults to empty. + * + * encoding => + * For MySQL, MySQLi, Postgres and DB2, specifies the character encoding to use when connecting to the + * database. Uses database default. + * + */ +class DATABASE_CONFIG { + + var $default = array( + 'driver' => 'mysql', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'user', + 'password' => 'password', + 'database' => 'database_name', + 'prefix' => '', + ); + + var $test = array( + 'driver' => 'mysql', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'user', + 'password' => 'password', + 'database' => 'test_database_name', + 'prefix' => '', + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/config/routes.php b/code/ryzom/tools/server/www/webtt/app/config/routes.php new file mode 100644 index 000000000..7f5ab74fe --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/routes.php @@ -0,0 +1,39 @@ + 'pages', 'action' => 'display', 'home')); +/** + * ...and connect the rest of 'Pages' controller's urls. + */ + Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); +/** + * Connect 'Pages' controller's urls for admin prefix. + */ + Router::connect('/admin/pages/*', array('controller' => 'pages', 'action' => 'display', 'admin' => true)); + Router::connect('/admin/pages', array('controller' => 'pages', 'action' => 'display', 'admin' => true, 'home')); + Router::connect('/admin', array('controller' => 'pages', 'action' => 'display', 'admin' => true, 'home')); diff --git a/code/ryzom/tools/server/www/webtt/app/config/schema/db_acl.php b/code/ryzom/tools/server/www/webtt/app/config/schema/db_acl.php new file mode 100644 index 000000000..96b96bd9a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/schema/db_acl.php @@ -0,0 +1,73 @@ + array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'parent_id' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'model' => array('type'=>'string', 'null' => true), + 'foreign_key' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'alias' => array('type'=>'string', 'null' => true), + 'lft' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'rght' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)) + ); + + var $aros = array( + 'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'parent_id' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'model' => array('type'=>'string', 'null' => true), + 'foreign_key' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'alias' => array('type'=>'string', 'null' => true), + 'lft' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'rght' => array('type'=>'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)) + ); + + var $aros_acos = array( + 'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'aro_id' => array('type'=>'integer', 'null' => false, 'length' => 10, 'key' => 'index'), + 'aco_id' => array('type'=>'integer', 'null' => false, 'length' => 10), + '_create' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + '_read' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + '_update' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + '_delete' => array('type'=>'string', 'null' => false, 'default' => '0', 'length' => 2), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'ARO_ACO_KEY' => array('column' => array('aro_id', 'aco_id'), 'unique' => 1)) + ); + +} diff --git a/code/ryzom/tools/server/www/webtt/app/config/schema/i18n.php b/code/ryzom/tools/server/www/webtt/app/config/schema/i18n.php new file mode 100644 index 000000000..27e1ec357 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/schema/i18n.php @@ -0,0 +1,50 @@ + array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'locale' => array('type'=>'string', 'null' => false, 'length' => 6, 'key' => 'index'), + 'model' => array('type'=>'string', 'null' => false, 'key' => 'index'), + 'foreign_key' => array('type'=>'integer', 'null' => false, 'length' => 10, 'key' => 'index'), + 'field' => array('type'=>'string', 'null' => false, 'key' => 'index'), + 'content' => array('type'=>'text', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'locale' => array('column' => 'locale', 'unique' => 0), 'model' => array('column' => 'model', 'unique' => 0), 'row_id' => array('column' => 'foreign_key', 'unique' => 0), 'field' => array('column' => 'field', 'unique' => 0)) + ); + +} diff --git a/code/ryzom/tools/server/www/webtt/app/config/schema/sessions.php b/code/ryzom/tools/server/www/webtt/app/config/schema/sessions.php new file mode 100644 index 000000000..4581c29c6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/config/schema/sessions.php @@ -0,0 +1,47 @@ + array('type'=>'string', 'null' => false, 'key' => 'primary'), + 'data' => array('type'=>'text', 'null' => true, 'default' => NULL), + 'expires' => array('type'=>'integer', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)) + ); + +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/app_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/app_controller.php new file mode 100644 index 000000000..a60584a71 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/app_controller.php @@ -0,0 +1,73 @@ + array("authorize"=>"controller")); + var $layout = "new"; + + function beforeFilter() { + parent::beforeFilter(); + $this->Auth->loginAction = array('admin' => false, 'controller' => 'users', 'action' => 'login'); + + if ($this->Auth->user('role') == "admin") + $this->Auth->allow("*"); + else if ($this->Auth->user()) + { + // $this->Auth->allow('index', 'view', 'add', 'delete', 'edit'); + foreach ($this->methods as $method) + if (mb_strpos($method, 'admin_') !== 0) + $this->Auth->allow($method); + } + } + + function isAuthorized() { +/* if (isset($this->params['prefix']) && $this->params['prefix'] == "admin" && $this->Auth->user('role') != "admin") + { + return false; + } + + return true;*/ + $action = $this->params['action']; + $allowedActions = array_map('strtolower', $this->Auth->allowedActions); + $isAllowed = ( + $this->Auth->allowedActions == array('*') || + in_array($action, $allowedActions) + ); +// $this->log($isAllowed); + return $isAllowed; +// + } + + +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/components/empty b/code/ryzom/tools/server/www/webtt/app/controllers/components/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/file_identifiers_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/file_identifiers_controller.php new file mode 100644 index 000000000..eabc80e77 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/file_identifiers_controller.php @@ -0,0 +1,128 @@ +FileIdentifier->recursive = 0; + $this->set('fileIdentifiers', $this->paginate()); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid file identifier', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('fileIdentifier', $this->FileIdentifier->read(null, $id)); + } + + function add() { + if (!empty($this->data)) { + $this->FileIdentifier->create(); + if ($this->FileIdentifier->save($this->data)) { + $this->Session->setFlash(__('The file identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The file identifier could not be saved. Please, try again.', true)); + } + } + $importedTranslationFiles = $this->FileIdentifier->ImportedTranslationFile->find('list'); + $identifiers = $this->FileIdentifier->Identifier->find('list'); + $this->set(compact('importedTranslationFiles', 'identifiers')); + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid file identifier', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->FileIdentifier->save($this->data)) { + $this->Session->setFlash(__('The file identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The file identifier could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->FileIdentifier->read(null, $id); + } + $importedTranslationFiles = $this->FileIdentifier->ImportedTranslationFile->find('list'); + $identifiers = $this->FileIdentifier->Identifier->find('list'); + $this->set(compact('importedTranslationFiles', 'identifiers')); + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for file identifier', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->FileIdentifier->delete($id)) { + $this->Session->setFlash(__('File identifier deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('File identifier was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + $this->FileIdentifier->recursive = 0; + $this->set('fileIdentifiers', $this->paginate()); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid file identifier', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('fileIdentifier', $this->FileIdentifier->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->FileIdentifier->create(); + if ($this->FileIdentifier->save($this->data)) { + $this->Session->setFlash(__('The file identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The file identifier could not be saved. Please, try again.', true)); + } + } + $importedTranslationFiles = $this->FileIdentifier->ImportedTranslationFile->find('list'); + $identifiers = $this->FileIdentifier->Identifier->find('list'); + $this->set(compact('importedTranslationFiles', 'identifiers')); + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid file identifier', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->FileIdentifier->save($this->data)) { + $this->Session->setFlash(__('The file identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The file identifier could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->FileIdentifier->read(null, $id); + } + $importedTranslationFiles = $this->FileIdentifier->ImportedTranslationFile->find('list'); + $identifiers = $this->FileIdentifier->Identifier->find('list'); + $this->set(compact('importedTranslationFiles', 'identifiers')); + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for file identifier', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->FileIdentifier->delete($id)) { + $this->Session->setFlash(__('File identifier deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('File identifier was not deleted', true)); + $this->redirect(array('action' => 'index')); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/identifiers_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/identifiers_controller.php new file mode 100644 index 000000000..01c5911e7 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/identifiers_controller.php @@ -0,0 +1,156 @@ +Identifier->recursive = 0; +// Router::connectNamed(array('language')); + + $conditions = null; + if (isset($this->passedArgs['language']) && $lang = $this->passedArgs['language']) + $conditions = array('Identifier.language_id' => $lang); + if (isset($this->passedArgs['translation_file_id']) && $translation_file_id = $this->passedArgs['translation_file_id']) + $conditions = array('Identifier.translation_file_id' => $translation_file_id); + $this->set('identifiers', $this->paginate($conditions)); + } + + function admin_withoutBestTranslation() + { + if (isset($this->passedArgs['imported_translation_file_id']) && $imported_translation_file_id = $this->passedArgs['imported_translation_file_id']) + { + $identifier_ids = $this->Identifier->withoutBestTranslation(array('ImportedTranslationFile.id' => $this->passedArgs['imported_translation_file_id'])); + if ($identifier_ids === false) + { + $this->Session->setFlash(__('Error: no conditions specified', true)); + } + else + { + $conditions = array('Identifier.id' => $identifier_ids, 'BestTranslation.id' => NULL); + $this->set('identifiers', $this->paginate($conditions)); + } +// $this->log($this->Identifier->withoutBestTranslation(array('ImportedTranslationFile.id' => $this->passedArgs['imported_translation_file_id']))); + // TOTHINK: try to achieve that with custom find with pagination + } + else + { + $this->Session->setFlash(__('No imported file specified', true)); + $this->redirect($this->referer()); + } + $this->render('index'); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid identifier', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('identifier', $this->Identifier->read(null, $id)); + } + + function add() { + if (!empty($this->data)) { + $this->Identifier->create(); + if ($this->Identifier->save($this->data)) { + $this->Session->setFlash(__('The identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The identifier could not be saved. Please, try again.', true)); + } + } + $languages = $this->Identifier->Language->find('list'); + $this->set(compact('languages')); + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid identifier', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Identifier->save($this->data)) { + $this->Session->setFlash(__('The identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The identifier could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Identifier->read(null, $id); + } + $languages = $this->Identifier->Language->find('list'); + $this->set(compact('languages')); + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for identifier', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Identifier->delete($id)) { + $this->Session->setFlash(__('Identifier deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Identifier was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + $this->Identifier->recursive = 0; + $this->set('identifiers', $this->paginate()); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid identifier', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('identifier', $this->Identifier->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->Identifier->create(); + if ($this->Identifier->save($this->data)) { + $this->Session->setFlash(__('The identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The identifier could not be saved. Please, try again.', true)); + } + } + $languages = $this->Identifier->Language->find('list'); + $this->set(compact('languages')); + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid identifier', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Identifier->save($this->data)) { + $this->Session->setFlash(__('The identifier has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The identifier could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Identifier->read(null, $id); + } + $languages = $this->Identifier->Language->find('list'); + $this->set(compact('languages')); + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for identifier', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Identifier->delete($id)) { + $this->Session->setFlash(__('Identifier deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Identifier was not deleted', true)); + $this->redirect(array('action' => 'index')); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/imported_translation_files_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/imported_translation_files_controller.php new file mode 100644 index 000000000..58296aed4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/imported_translation_files_controller.php @@ -0,0 +1,210 @@ +ImportedTranslationFile->recursive = 0; + $this->set('importedTranslationFiles', $this->paginate()); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid translation file', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('importedTranslationFile', $this->ImportedTranslationFile->read(null, $id)); +// var_dump($this->ImportedTranslationFile->RawFile); + } + + function admin_import($filename = null) { +// $this->view = "index"; + App::import("Vendor","UxtParser", array("file" => 'UxtParser.php')); +/* if (!$filename) { + $this->Session->setFlash(__('Invalid file', true)); + $this->redirect(array('action' => 'index')); + return 0; + }*/ + $filename="diff/pl_diff_4DEC868A.uxt"; + $translationFile = $this->ImportedTranslationFile->find('first', array('conditions' => array('ImportedTranslationFile.filename' => $filename))); + if ($translationFile) + { + $this->Session->setFlash(__('Translation file already imported', true)); + $this->redirect(array('action' => 'index')); + return 0; + } +// var_dump($file); + $parser = new UxtParser(); + $parsedFile = $parser->parseFile($filename); +// var_dump($parsedFile); + $arr = explode("_", basename($filename, ".uxt")); +// var_dump($arr); + $language_id = 1; + + $this->ImportedTranslationFile->create(); + $data['ImportedTranslationFile']['language_id'] = $language_id; + $data['ImportedTranslationFile']['filename'] = $filename; + //$this->ImportedTranslationFile->save($data); + foreach ($parsedFile as $ent) + { + $fi_data = array(); + if ($ent['type'] != "string") + continue; + + + $i_data['language_id'] = $language_id; + $i_data['translation_index'] = $ent['index']; + $i_data['reference_string'] = $ent['string']; + unset($this->ImportedTranslationFile->Language->Identifier->id); + $identifier = $this->ImportedTranslationFile->Language->Identifier->find('first',array('conditions' => array('Identifier.identifier' => $ent['identifier'], 'Identifier.language_id' => $language_id))); + if ($identifier) + { +// var_dump($identifier); + $i_data['id']=$identifier['Identifier']['id']; + } + else + { + $i_data['identifier'] = $ent['identifier']; + $i_data['translated'] = false; + } + var_dump($i_data); + $this->ImportedTranslationFile->Language->Identifier->save(array('Identifier' => $i_data)); + $identifier_id = $this->ImportedTranslationFile->Language->Identifier->id; + var_dump($identifier_id); + + unset($this->ImportedTranslationFile->FileIdentifier->id); + //TODO - set FileIdentifier['id'] if we import already imported file (imported imported file temporarly disabled) +// $identifier = $this->ImportedTranslationFile->FileIdentifier->find('first',array('conditions' => array('FileIdentifier.identifier' => $ent['identifier'], 'FileIdentifier.translation_file_id' => $))); +// $data['FileIdentifier']['translation_file_id'] = $this->ImportedTranslationFile->id; + if ($ent['diff']) + $fi_data['command'] = "DIFF " . mb_strtoupper($ent['diff']); + $fi_data['translation_index'] = $ent['index']; +// $data['FileIdentifier']['identifier_id'] = ; + $fi_data['reference_string'] = $ent['string']; + $fi_data['identifier_id'] = $identifier_id; + +// $this->ImportedTranslationFile->FileIdentifier->create(); +// $this->ImportedTranslationFile->FileIdentifier->save($data); + $data['FileIdentifier'][] = $fi_data; +// $l_data['Language']['id'] = $language_id; +// $l_data['Identifier'][] = $i_data; +// $data['Identifier'][] = $i_data; + } +// var_dump($data); +// $this->ImportedTranslationFile->Language->saveAll($l_data); + $this->ImportedTranslationFile->saveAll($data); + $this->Session->setFlash(__('Translation file imported', true)); + $this->redirect(array('action' => 'view', $this->ImportedTranslationFile->id)); + $this->ImportedTranslationFile->recursive = 0; + $this->set('importedTranslationFiles', $this->paginate()); +// $this->render('index'); + } + + + function add() { + if (!empty($this->data)) { + $this->ImportedTranslationFile->create(); + if ($this->ImportedTranslationFile->save($this->data)) { + $this->Session->setFlash(__('The translation file has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); + } + } + $languages = $this->ImportedTranslationFile->Language->find('list'); + $this->set(compact('languages')); + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid translation file', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->ImportedTranslationFile->save($this->data)) { + $this->Session->setFlash(__('The translation file has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->ImportedTranslationFile->read(null, $id); + } + $languages = $this->ImportedTranslationFile->Language->find('list'); + $this->set(compact('languages')); + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for translation file', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->ImportedTranslationFile->delete($id)) { + $this->Session->setFlash(__('Translation file deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Translation file was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + $this->ImportedTranslationFile->recursive = 0; +// FireCake::dump("??",$_SERVER); + $this->set('importedTranslationFiles', $this->paginate()); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid translation file', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('importedTranslationFile', $this->ImportedTranslationFile->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->ImportedTranslationFile->create(); + if ($this->ImportedTranslationFile->save($this->data)) { + $this->Session->setFlash(__('The translation file has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); + } + } + $languages = $this->ImportedTranslationFile->Language->find('list'); + $this->set(compact('languages')); + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid translation file', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->ImportedTranslationFile->save($this->data)) { + $this->Session->setFlash(__('The translation file has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The translation file could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->ImportedTranslationFile->read(null, $id); + } + $languages = $this->ImportedTranslationFile->Language->find('list'); + $this->set(compact('languages')); + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for translation file', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->ImportedTranslationFile->delete($id)) { + $this->Session->setFlash(__('Translation file deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Translation file was not deleted', true)); + $this->redirect(array('action' => 'index')); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php new file mode 100644 index 000000000..53e8405d1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php @@ -0,0 +1,122 @@ +Language->recursive = 0; + $this->set('languages', $this->paginate()); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('language', $this->Language->read(null, $id)); + } + + function add() { + if (!empty($this->data)) { + $this->Language->create(); + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Language->read(null, $id); + } + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for language', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Language->delete($id)) { + $this->Session->setFlash(__('Language deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Language was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + $this->Language->recursive = 0; + $this->set('languages', $this->paginate()); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('language', $this->Language->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->Language->create(); + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Language->read(null, $id); + } + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for language', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Language->delete($id)) { + $this->Session->setFlash(__('Language deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Language was not deleted', true)); + $this->redirect(array('action' => 'index')); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php.bak b/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php.bak new file mode 100644 index 000000000..46234b733 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/languages_controller.php.bak @@ -0,0 +1,125 @@ +Language->recursive = 0; + $this->set('languages', $this->paginate()); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('language', $this->Language->read(null, $id)); +/* $options = array('Language.id' => $id, 'recursive' => 1, + "joins" => array( + array('table' => ' + ), + ); + var_dump($this); + $this->set('language', $bumz = $this->Language->find('first', $options)); +var_dump($bumz);*/ +// $this->set('identifier', $this->Language->TranslationFile->read(null, $id)); + } + + function add() { + if (!empty($this->data)) { + $this->Language->create(); + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Language->read(null, $id); + } + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for language', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Language->delete($id)) { + $this->Session->setFlash(__('Language deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Language was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + $this->Language->recursive = 0; + $this->set('languages', $this->paginate()); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('language', $this->Language->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->Language->create(); + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid language', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Language->save($this->data)) { + $this->Session->setFlash(__('The language has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The language could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Language->read(null, $id); + } + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for language', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Language->delete($id)) { + $this->Session->setFlash(__('Language deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Language was not deleted', true)); + $this->redirect(array('action' => 'index')); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/raw_files_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/raw_files_controller.php new file mode 100644 index 000000000..618110db2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/raw_files_controller.php @@ -0,0 +1,559 @@ +RawFile->recursive = 1; +// var_dump($this->RawFile->find('count')); +// $db =& ConnectionManager::getDataSource($this->RawFile->useDbConfig); +// var_dump($db->calculate($this->RawFile, 'count')); + $conditions['RawFile.dir'] = array("diff","translated"); + $this->set('rawFiles', $this->paginate($conditions)); +// $this->log(Router::parse($this->referer())); +// var_dump($this->paginate()); + } + + function admin_listdir($extension = null) { + $this->RawFile->recursive = 0; + $this->set('rawFiles', $this->paginate(array("RawFile.extension" => $extension))); + $this->rendeR("admin_index"); +// var_dump($this->paginate()); + } + + function admin_view($dir = null, $filename = null) { + if (!$filename) { + $this->Session->setFlash(__('Invalid raw file', true)); + $this->redirect(array('action' => 'index')); + } + if (!$this->RawFile->open($dir, $filename)) + { + $this->Session->setFlash(__('Can\'t open file', true)); + $this->redirect(array('action' => 'index')); + return 0; + } +// $id = $dir . DS . $filename; +// $this->set('rawFile', $this->RawFile->read(null, $id)); + $this->set('rawFile', $rawFile = $this->RawFile->find('first', array( + "conditions" => array( + "RawFile.dir" => $dir, + "RawFile.filename" => $filename, + ), + ))); + + $this->set('fileContent', $this->RawFile->_currentFile->read()); + } + +/* function import($dir = null, $filename = null) { + $this->admin_import($dir, $filename); + }*/ + + function admin_import($dir = null, $filename = null) { +// $this->view = "index"; +// App::import("Vendor","UxtParser", array("file" => 'UxtParser.php')); + if (!$filename) { + $this->Session->setFlash(__('Invalid file', true)); + $this->redirect(array('action' => 'index')); + return 0; + } + if (!$this->RawFile->open($dir, $filename)) + { + $this->Session->setFlash(__('Can\'t open file', true)); + $this->redirect(array('action' => 'index')); + return 0; + } + $importedTranslationFileModel = $this->RawFile->ImportedTranslationFile; + $translationFileModel = $importedTranslationFileModel->TranslationFile; + $languageModel = $translationFileModel->Language; +// $identifierModel = $languageModel->Identifier; + $identifierModel = $translationFileModel->Identifier; + $identifierColumnModel = $identifierModel->IdentifierColumn; + $translationModel = $identifierModel->Translation; + $fileIdentifierModel = $importedTranslationFileModel->FileIdentifier; + +// $filename="diff/pl_diff_4DEC868A.uxt"; + $importedTranslationFile = $importedTranslationFileModel->find('first', array('conditions' => array('ImportedTranslationFile.filename' => $dir . DS . $filename), "recursive" => -1)); +/* var_dump($translationFile); + return 0;*/ + if ($importedTranslationFile) + { + $this->Session->setFlash(__('Translation file already imported', true)); + $this->redirect(array('action' => 'index')); + return 0; + } +// var_dump($file); +// $parser = new UxtParser(); +// $arr = explode("_", basename($filename, ".uxt")); +// var_dump($arr); + +// $language_id = 1; + $languageCode = $this->RawFile->getLanguageCode($filename); + if (!$languageCode) + { + $this->Session->setFlash(__('Can\'t identify language', true)); + $this->redirect(array('action' => 'index')); + return 0; + } + $language = $languageModel->find('first', array('conditions' => array('code' => $languageCode), "recursive" => -1)); + $language_id = $language['Language']['id']; + if (!$language_id) + { + $this->Session->setFlash(__('Can\'t find language in database', true)); + $this->redirect(array('action' => 'index')); + return 0; + } + else + { +// var_dump($language_id); + } + + $filename_template = preg_replace('/_diff/', '', $filename); + $filename_template = preg_replace('/_[A-F0-9]{8}/', '', $filename_template); + +// for global identifiers +/* if (preg_match('|^.*_' . $language['Language']['code'] . '.*$|', $filename_template, $matches)) + $filename_template = preg_replace('/_' . $language['Language']['code'] . '/', '_LC', $filename_template); + else if (preg_match('|^.*' . $language['Language']['code'] . '.*$|', $filename_template, $matches)) + $filename_template = preg_replace('/' . $language['Language']['code'] . '/', 'LC', $filename_template); + else + { + $this->Session->setFlash(__('Can\'t create master translation filename template from current filename', true)); + $this->redirect(array('action' => 'index')); + return 0; + }*/ + + $translationFile = $translationFileModel->find('first', array('conditions' => array('filename_template' => $filename_template), "recursive" => -1)); + if (!$translationFile) + { + $tf_data['filename_template'] = $filename_template; + $tf_data['language_id'] = $language_id; + } + else + $tf_data['id'] = $translationFile['TranslationFile']['id']; + + $res = $translationFileModel->saveAll(array('TranslationFile' => $tf_data)); + $translation_file_id = $translationFileModel->id; + + $parsedFile = $this->RawFile->parseFile(); +/* var_dump($parsedFile); + $this->render('index'); + return 0;*/ +// $this->log($parsedFile); + if (!$parsedFile) + { + $this->Session->setFlash(__('Error importing file', true)); + $this->redirect(array('action' => 'index')); + return 0; + } +// $this->log($parsedFile); +// return 0; + + ini_set('max_execution_time',0); + + $processedEntities = 0; + + $importedTranslationFileModel->create(); + $data['ImportedTranslationFile']['language_id'] = $language_id; + $data['ImportedTranslationFile']['translation_file_id'] = $translation_file_id; + $data['ImportedTranslationFile']['filename'] = $dir . DS . $filename; + $data['ImportedTranslationFile']['file_last_modified_date'] = $this->RawFile->_currentFileLastChange; + +// $data['TranslationFile'] = $tf_data; + $importedTranslationFileModel->saveAll($data); + $importedTranslationFile_id = $importedTranslationFileModel->id; + + //$this->ImportedTranslationFile->save($data); + foreach ($parsedFile as $ent) + { + if (!isset($ent['type'])) + var_dump($ent); + + if ($ent['type'] == 'sheet_description') + { + $_columns = $ent['columns']; + $_sheet_id_column = $ent['sheet_id_column']; + } + + if ($ent['type'] != "string" && $ent['type'] != "phrase" && $ent['type'] != 'sheet') + continue; + + $newIdentifier = false; + $i_data = array(); + $i_data['language_id'] = $language_id; + $i_data['translation_file_id'] = $translation_file_id; + if (isset($ent['index'])) + $i_data['translation_index'] = $ent['index']; + if (isset($ent['arguments'])) + $i_data['arguments'] = $ent['arguments']; + + if (isset($ent['diff']) && isset($ent['string'])) + { + $i_data['reference_string'] = $ent['string']; + } + + unset($identifierModel->id); + $identifier = $identifierModel->find('first',array('conditions' => array('Identifier.identifier' => $ent['identifier'], 'Identifier.translation_file_id' => $translation_file_id), 'contain' => 'IdentifierColumn')); + //App::import('Vendor', 'DebugKit.FireCake'); +// FireCake::log($ent['identifier'], "Identifier"); +// FireCake::dump("identifier",$identifier); +/* $this->log($ent['identifier']); + $this->log($identifier);*/ + if ($identifier) + { +// var_dump($identifier); + $i_data['id']=$identifier['Identifier']['id']; +// $this->log("found"); + } + else + { + $identifierModel->create(); + $i_data['identifier'] = $ent['identifier']; + if (isset($ent['diff'])) + $i_data['translated'] = false; + $newIdentifier = true; +// $this->log("not found"); +// $this->log("id: # " . $identifierModel->id . " #"); +// $this->log($i_data); + + } +// var_dump($i_data); + $res = $identifierModel->saveAll($tarr = array('Identifier' => $i_data)); + $identifier_id = $identifierModel->id; +/* $this->log('identifier saveAll res'); + $this->log($res); + $this->log(var_export($res,true)); + $this->log($identifierModel->validationErrors); + $this->log($identifierModel); + $this->log('#identifier id'); + $this->log($identifier_id); + $this->log("tarr"); + $this->log($tarr);*/ + + if (isset($ent['columns']) && is_array($ent['columns'])) + { +/* $this->log($_columns); + $this->log($ent['columns']);*/ + $ic_data = array(); + foreach ($ent['columns'] as $column_no => $value) + { + unset($identifierColumnModel->id); + $ic_arr = array(); + $ic_arr['identifier_id'] = $identifier_id; + $column_name = $_columns[$column_no]; +/* $this->log($identifier); + $this->log($column_name);*/ + if (!$newIdentifier) + { + foreach ($identifier['IdentifierColumn'] as $identifierColumn_no => $identifierColumn) + { + if ($identifierColumn['column_name'] == $column_name) + { + $ic_arr['id'] = $identifierColumn['id']; + break; + } + } + } + $ic_arr['column_name'] = $column_name; + if (isset($ent['diff'])) + $ic_arr['reference_string'] = $value; + $ic_data[] = $ic_arr; +// $this->log($ic_arr); + $res = $identifierColumnModel->save($ic_arr); +// $this->log($res); + $identifierColumn_id = $identifierColumnModel->id; +/* $this->log($identifierColumnModel->validationErrors); + $this->log(var_export($res,true));*/ + + if (!isset($ent['diff'])) // it is translated file and we add translation + { + unset($translationModel->id); + if ($newIdentifier) // ovbiously there's no translation for identifier we just created + $translation = array(); + else + $translation = $translationModel->find('first',array('conditions' => array('Translation.identifier_column_id' => $identifierColumn_id, 'Translation.translation_text' => $value), "recursive" => -1)); + + if (!$translation) + { + $t_data['identifier_column_id'] = $identifierColumn_id; + $t_data['translation_text'] = $value; + // TODO: change user_id for authorized user + $t_data['user_id'] = 1; + } + else + $t_data['id'] = $translation['Translation']['id']; +// var_dump($i_data); + $translationModel->save(array('Translation' => $t_data)); + } + + } +/* $res = $identifierColumnModel->saveAll($tarr = array('IdentifierColumn' => $ic_data)); + $this->log($tarr); + $this->log(var_export($res,true)); + $this->log($identifierColumnModel->validationErrors);*/ + } + else + { + if (!isset($ent['diff'])) // it is translated file and we add translation + { + unset($translationModel->id); + if ($newIdentifier) // ovbiously there's no translation for identifier we just created + $translation = array(); + else + $translation = $translationModel->find('first',array('conditions' => array('Translation.identifier_id' => $identifier_id, 'Translation.translation_text' => $ent["string"]), "recursive" => -1)); + if (!$translation) + { + $t_data['identifier_id'] = $identifier_id; + if (isset($ent['string'])) // sheets doesn't have string (they have columns) + $t_data['translation_text'] = $ent['string']; + // TODO: change user_id for authorized user + $t_data['user_id'] = 1; + } + else + $t_data['id'] = $translation['Translation']['id']; +// var_dump($i_data); + $translationModel->save(array('Translation' => $t_data)); + } + } + + unset($fileIdentifierModel->id); + $fi_data = array(); + $fi_data['imported_translation_file_id'] = $importedTranslationFile_id; + // TOTHINK - set FileIdentifier['id'] if we import already imported file (not supporting importing imported file) +// $identifier = $this->ImportedTranslationFile->FileIdentifier->find('first',array('conditions' => array('FileIdentifier.identifier' => $ent['identifier'], 'FileIdentifier.translation_file_id' => $))); +// $data['FileIdentifier']['translation_file_id'] = $this->ImportedTranslationFile->id; + if (isset($ent['arguments'])) + $fi_data['arguments'] = $ent['arguments']; + + if (isset($_sheet_id_column)) + $fi_data['arguments'] = $_sheet_id_column; + + if (isset($ent['diff'])) // it is diff file + { + if (isset($ent['command'])) + $fi_data['command'] = $ent['command']; + else + $fi_data['command'] = "DIFF " . mb_strtoupper($ent['diff']); + + if (isset($ent['string'])) + $fi_data['reference_string'] = $ent['string']; + + if (isset($ent['index'])) + $fi_data['translation_index'] = $ent['index']; +// $data['FileIdentifier']['identifier_id'] = ; + $fi_data['identifier_id'] = $identifier_id; + + $res = $fileIdentifierModel->saveAll($tarr = array('FileIdentifier' => $fi_data)); +// $this->log($res); +/* $this->log("#fi_data"); + $this->log($fi_data);*/ + $fileIdentifier_id = $fileIdentifierModel->id; + } + +// $this->ImportedTranslationFile->FileIdentifier->create(); +// $this->ImportedTranslationFile->FileIdentifier->save($data); +// $data['FileIdentifier'][] = $fi_data; +// $l_data['Language']['id'] = $language_id; +// $l_data['Identifier'][] = $i_data; +// $data['Identifier'][] = $i_data; + + $processedEntities++; + + } +/* $this->render('admin_index'); + return 0;*/ +// var_dump($data); +// $this->ImportedTranslationFile->Language->saveAll($l_data); + if ($processedEntities == 0) + { + $importedTranslationFileModel->delete($importedTranslationFile_id); + $this->Session->setFlash(__('File was not imported because it seems empty', true)); +// $this->redirect(array('action' => 'index')); + $this->redirect($this->referer()); + return 0; + } + else + { + $this->Session->setFlash(__('Translation file imported into database successfully. Processed entities: ' . $processedEntities, true)); + $this->redirect(array('controller' => 'imported_translation_files', 'action' => 'view', $importedTranslationFileModel->id)); +// $this->render('admin_index'); + return 0; + } +// $this->ImportedTranslationFile->recursive = 0; +// $this->set('importedTranslationFiles', $this->paginate()); +// $this->render('index'); + } + + function admin_export($dir = null, $filename = null, $importedTranslationFileId = null) { + if (!$filename) { + $this->Session->setFlash(__('Invalid file', true)); + $this->redirect($this->referer()); +// $this->redirect(array('action' => 'index')); + return 0; + } + if (!$this->RawFile->open($dir, $filename, $writable = true)) + { + $this->Session->setFlash(__('Can\'t open file for writing', true)); + $this->redirect($this->referer()); +// $this->redirect(array('action' => 'index')); + return 0; + } + + $importedTranslationFileModel = $this->RawFile->ImportedTranslationFile; + + $importedTranslationFileModel->contain(array( + 'TranslationFile', + 'FileIdentifier' => array('Identifier' => array( + 'Translation', + 'IdentifierColumn' => 'Translation', + )), + )); + + $importedTranslationFile = $importedTranslationFileModel->find('first', array( + 'conditions' => array( + 'ImportedTranslationFile.filename' => $dir . DS . $filename + ), +// 'recursive' => 3 +// 'order' => 'FileIdentifier.translation_index', + ) + ); +/* var_dump($translationFile); + return 0;*/ + if (!$importedTranslationFile) + { + $this->Session->setFlash(__('No imported translation file found for chosen file', true)); + $this->redirect($this->referer()); +// $this->redirect(array('controller' => 'imported_translation_files', 'action' => 'index')); + return 0; + } + + $translationFileModel = $importedTranslationFileModel->TranslationFile; + $identifierModel = $translationFileModel->Identifier; + + // TODO: check if all identifiers have "best" translation + $identifier_ids = $identifierModel->withoutBestTranslation(array('ImportedTranslationFile.id' => $importedTranslationFile['ImportedTranslationFile']['id'])); + if ($identifier_ids === false) + { + $this->Session->setFlash(__('Error: no conditions specified', true)); + $this->redirect($this->referer()); + return 0; + } + else if (count($identifier_ids) > 0) + { + $this->Session->setFlash(__('Best translation is not set for some of the identifiers in this file. Set best translation before export.', true)); + $this->redirect(array('controller' => 'identifiers', 'action' => 'withoutBestTranslation', 'imported_translation_file_id' => $importedTranslationFile['ImportedTranslationFile']['id'])); + return 0; + } + + $translationFile_id = $importedTranslationFile['ImportedTranslationFile']['translation_file_id']; + + $i=0; + $sortResult = Set::sort($importedTranslationFile['FileIdentifier'], '{n}.translation_index', 'asc'); + if (!$sortResult) + { + $this->Session->setFlash(__('Sorting error', true)); + $this->redirect($this->referer()); + return 0; + } + + foreach ($sortResult as $fileIdentifier) + { + if ($fileIdentifier['Identifier']['IdentifierColumn'] && !isset($entities[0])) + { + foreach ($fileIdentifier['Identifier']['IdentifierColumn'] as $column_no => $identifierColumn) + $_columns[$column_no] = $identifierColumn['column_name']; + $ent['columns'] = $_columns; + $ent['type'] = 'sheet_description'; + $ent['sheet_id_column'] = $fileIdentifier['arguments']; + $ent['diff'] = ((isset($fileIdentifier['command']) && !empty($fileIdentifier['command'])) ? true : null); + $entities[] = $ent; + $ent = array(); + } + $ent = array( + 'diff' => ((isset($fileIdentifier['command']) && !empty($fileIdentifier['command'])) ? $fileIdentifier['command'] : null), + 'command' => ((isset($fileIdentifier['command']) && !empty($fileIdentifier['command'])) ? $fileIdentifier['command'] : null), + 'index' => ((isset($fileIdentifier['translation_index']) && !empty($fileIdentifier['translation_index'])) ? $fileIdentifier['translation_index'] : null), + 'internal_index' => $i++, + 'type' => ((count($fileIdentifier['Identifier']['IdentifierColumn']) > 0) ? 'sheet' : 'string'), +// 'type' => ((isset($fileIdentifier['command']) && !empty($fileIdentifier['command'])) ? $fileIdentifier['command'] : null), + 'identifier' => $fileIdentifier['Identifier']['identifier'], + 'arguments' => ((isset($fileIdentifier['arguments']) && !empty($fileIdentifier['arguments'])) ? $fileIdentifier['arguments'] : null), +// 'string' => '', + ); +// $this->log($fileIdentifier['Identifier']['Translation']); +// if (Set::numeric(array_keys($fileIdentifier['Identifier']['Translation']))) + if (isset($fileIdentifier['Identifier']['Translation'][0])) + { +// $this->log('numeric'); + $ent['string'] = $fileIdentifier['Identifier']['Translation'][0]['translation_text']; + } + else if (isset($fileIdentifier['Identifier']['Translation']['translation_text'])) + $ent['string'] = $fileIdentifier['Identifier']['Translation']['translation_text']; + + if (isset($fileIdentifier['Identifier']['BestTranslation']['translation_text'])) + $ent['string'] = $fileIdentifier['Identifier']['BestTranslation']['translation_text']; + + if (($export_reference_if_empty_translation = true) && !isset($ent['string'])) + $ent['string'] = $fileIdentifier['Identifier']['reference_string']; + else if (!isset($ent['string'])) + $ent['string'] = ''; + + foreach ($fileIdentifier['Identifier']['IdentifierColumn'] as $column_no => $identifierColumn) + { +/* if (isset($identifierColumn['Translation']['translation_text'])) + $ent['columns'][$column_no] = $identifierColumn['Translation']['translation_text'];*/ + + if (isset($identifierColumn['Translation'][0])) + $ent['columns'][$column_no] = $identifierColumn['Translation'][0]['translation_text']; + else if (isset($identifierColumn['Translation']['translation_text'])) + $ent['columns'][$column_no] = $identifierColumn['Translation']['translation_text']; + + if (isset($identifierColumn['BestTranslation']['translation_text'])) + $ent['columns'][$column_no] = $identifierColumn['BestTranslation']['translation_text']; + + if ($export_reference_if_empty_translation && !isset($ent['columns'][$column_no])) + $ent['columns'][$column_no] = $identifierColumn['reference_string']; + else if (!isset($ent['columns'][$column_no])) + $ent['columns'][$column_no] = ''; + } + if ($fileIdentifier['command']) + $ent['command'] = $ent['diff'] = $fileIdentifier['command']; + + $entities[] = $ent; + } +/* $sources = ConnectionManager::sourceList(); + $sqlLogs = array(); + foreach ($sources as $source) + { + $db =& ConnectionManager::getDataSource($source); + if (!$db->isInterfaceSupported('getLog')) + continue; + $sqlLogs[$source] = $db->getLog(); + } + $this->log($sqlLogs);*/ + +// $this->log($importedTranslationFile); +/* $this->log($sortResult); + $this->log($entities);*/ + + ini_set('max_execution_time',0); + + $result = $this->RawFile->buildFile($entities); +// $this->log($result); +// $this->render('admin_index'); +// $this->redirect(array('controller' => 'imported_translation_files', 'action' => 'index')); +// return 0; + +/* var_dump($parsedFile); + $this->render('index'); + return 0;*/ +// $this->log($parsedFile); + if (!$result) + { + $this->Session->setFlash(__('Error exporting file', true)); + $this->redirect(array('action' => 'index')); + return 0; + } + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/translations_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/translations_controller.php new file mode 100644 index 000000000..f50e265d5 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/translations_controller.php @@ -0,0 +1,162 @@ +Translation->recursive = 0; + $conditions = null; + if (isset($this->passedArgs['identifier_id']) && $identifier = $this->passedArgs['identifier_id']) + $conditions = array('Translation.identifier_id' => $identifier); + $this->set('translations', $this->paginate($conditions)); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid translation', true)); + $this->redirect(array('action' => 'index')); + } +// $this->recursive=2; + $this->set('translation', $translation = $this->Translation->read(null, $id)); + $this->set('identifier', $identifier = $this->Translation->Identifier->read(null, $translation['Translation']['identifier_id'])); +// var_dump($translation); +// var_dump($identifier); + } + + function add() { + if (!empty($this->data)) { + $this->Translation->create(); + if ($res = $this->Translation->save($this->data)) { + $this->Session->setFlash(__('The translation has been saved', true)); + $this->redirect(array('action' => 'index', 'identifier_id' => $res['Translation']['identifier_id'])); + } else { + $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); + } + } + if (empty($this->passedArgs['identifier_id'])) + { + $this->Session->setFlash(__('You need to choose identifier for translation', true)); + $this->redirect(array('controller' => 'identifiers', 'action' => 'index')); + } + else + { + $identifier_id = $this->passedArgs['identifier_id']; + $this->set('identifier', $identifier = $this->Translation->Identifier->read(null, $identifier_id)); +// $this->data['Translation.identifier_id'] = $identifier_id; + } +// $identifiers = $this->Translation->Identifier->find('list', array('recursive' => -1)); + $users = $this->Translation->User->find('list'); + $this->set(compact('identifiers', 'users')); + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid translation', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Translation->save($this->data)) { + $this->Session->setFlash(__('The translation has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Translation->read(null, $id); + } +// var_dump($this->data); + $identifier = $this->Translation->Identifier->read(null, $this->data['Translation']['identifier_id']); + $identifiers = $this->Translation->Identifier->find('list'); + $users = $this->Translation->User->find('list'); + $this->set(compact('identifiers', 'users', 'identifier')); + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for translation', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Translation->delete($id)) { + $this->Session->setFlash(__('Translation deleted', true)); +// $this->redirect(array('action'=>'index')); + $this->redirect($this->referer()); + } + $this->Session->setFlash(__('Translation was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + return $this->index(); + } + + function admin_setBest($id) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for translation', true)); + $this->redirect($this->referer()); + } + if ($this->Translation->setBest($id)) + $this->Session->setFlash(__('Set successful', true)); + else + $this->Session->setFlash(__('Set error', true)); + $this->redirect($this->referer()); +// $this->index(); +// $this->render('index'); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid translation', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('translation', $this->Translation->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->Translation->create(); + if ($this->Translation->save($this->data)) { + $this->Session->setFlash(__('The translation has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); + } + } + $identifiers = $this->Translation->Identifier->find('list'); + $users = $this->Translation->User->find('list'); + $this->set(compact('identifiers', 'users')); + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid translation', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Translation->save($this->data)) { + $this->Session->setFlash(__('The translation has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The translation could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Translation->read(null, $id); + } + $identifiers = $this->Translation->Identifier->find('list'); + $users = $this->Translation->User->find('list'); + $this->set(compact('identifiers', 'users')); + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for translation', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Translation->delete($id)) { + $this->Session->setFlash(__('Translation deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Translation was not deleted', true)); + $this->redirect(array('action' => 'index')); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/users_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/users_controller.php new file mode 100644 index 000000000..5c8cbcb70 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/users_controller.php @@ -0,0 +1,174 @@ +User->recursive = 0; + $this->set('users', $this->paginate()); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid user', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('user', $this->User->read(null, $id)); + } + + function add() { + if (!empty($this->data)) { + $this->User->create(); + if ($this->User->save($this->data)) { + $this->Session->setFlash(__('The user has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); + } + } + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid user', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->User->save($this->data)) { + $this->Session->setFlash(__('The user has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->User->read(null, $id); + } + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for user', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->User->delete($id)) { + $this->Session->setFlash(__('User deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('User was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + $this->User->recursive = 0; + $this->set('users', $this->paginate()); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid user', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('user', $this->User->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->User->create(); + if ($this->User->save($this->data)) { + $this->Session->setFlash(__('The user has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); + } + } + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid user', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->User->save($this->data)) { + $this->Session->setFlash(__('The user has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->User->read(null, $id); + } + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for user', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->User->delete($id)) { + $this->Session->setFlash(__('User deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('User was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + + function login() { + } + + function logout() { + $this->redirect($this->Auth->logout()); + } + + function beforeFilter() { + parent::beforeFilter(); + $this->Auth->allow(array('register', 'login', 'logout', 'confirm')); + } + + function register() { + if(!empty($this->data)) { + $this->User->create(); +/* $assigned_password = 'newpass'; + $this->data['User']['password'] = $this->Auth->password($assigned_password);*/ + $this->data['User']['password'] = $this->Auth->password($this->data['User']['passwd']); + $this->data['User']['confirm_hash'] = $this->Auth->password($this->data['User']['name'] . time()); + if($user = $this->User->save($this->data)) { + // send signup email containing password to the user +// $this->Session->setFlash('your password is ' . $assigned_password); +// $this->Session->setFlash('your password is ' . var_export($this->data['User']['password'], true)); +// $this->Auth->login($this->data); +// $this->Email->delivery = 'debug'; + $this->Email->from = 'webtt-noreply@openlink.pl'; + $this->Email->to = $user['User']['email']; + $this->Email->subject = 'WebTT registration'; + $this->Email->sendAs = 'text'; + $this->Email->template = 'registration'; + $this->set('user', $this->data); + $this->set('serverName', $_SERVER['SERVER_NAME']); + $this->params['url']['ext'] = 'no_debug'; +// var_dump($this->helpers); + unset($this->helpers['DebugKit.Toolbar']); + $this->Email->send(); + $this->Session->setFlash('Thank you for registreation. Please use confirm link from email to finalize registration.'); + $this->redirect('/'); + } + } + } + + function confirm($confirm_hash) + { + $user = $this->User->find('first', array('conditions' => array('User.confirm_hash' => $confirm_hash))); + if (!$user) + { + $this->Session->setFlash('No user found. Please register again.'); + $this->redirect('/'); + } + $this->User->id = $user['User']['id']; + $this->User->save(array('confirm_hash' => null)); + $this->Session->setFlash('Thank you for registreation. You can now log in.'); + $this->redirect('/'); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/controllers/votes_controller.php b/code/ryzom/tools/server/www/webtt/app/controllers/votes_controller.php new file mode 100644 index 000000000..7be099b29 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/controllers/votes_controller.php @@ -0,0 +1,165 @@ +Vote->recursive = 0; +// var_dump($this->Vote->belongsTo); +// var_dump($this->Vote->getAssociated()); +// $model = $this->{$this->modelClass}; +// $this->log($tree=$this->PathResolver->getAssociationsTree($model)); +// $this->log($this->PathResolver->getAssociationsGraph('User',$tree)); +// $this->log($this->PathResolver->printPath($model), 'info'); +// $this->log($this->PathResolver->node_path('Language', $tree)); + $this->set('votes', $this->paginate()); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid vote', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('vote', $this->Vote->read(null, $id)); + } + + function add() { + if (!empty($this->data)) { + $this->Vote->create(); + if ($this->Vote->save($this->data)) { + $this->Session->setFlash(__('The vote has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The vote could not be saved. Please, try again.', true)); + } + } + $translations = $this->Vote->Translation->find('list'); + $users = $this->Vote->User->find('list'); + $this->set(compact('translations', 'users')); + } + + function vote() { + if (empty($this->passedArgs['translation'])) + { + $this->Session->setFlash(__('You need to choose translation for your vote', true)); + $this->redirect(array('controller' => 'translations', 'action' => 'index')); + } + else + { + $translation_id = $this->passedArgs['translation']; + $translation = $this->Vote->Translation->read(null, $translation_id); + if (!$translation) + { + $this->Session->setFlash(__("Translation doesn't exist.", true)); + $this->redirect(array('controller' => 'translations', 'action' => 'index')); + } + $vote = array("Vote" => array( + 'translation_id' => $translation_id, + // TODO: authorized user + 'user_id' => 1, + ), + ); + $this->Vote->create(); + $this->Vote->save($vote); + $this->Session->setFlash(__('Vote added', true)); + $this->redirect($this->referer(array('controller' => 'translations', 'action' => 'index'))); +// $this->redirect(array('controller' => 'translations', 'action' => 'index')); +// $this->data['Translation.identifier_id'] = $identifier_id; + } + } + + function edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid vote', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Vote->save($this->data)) { + $this->Session->setFlash(__('The vote has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The vote could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Vote->read(null, $id); + } + $translations = $this->Vote->Translation->find('list'); + $users = $this->Vote->User->find('list'); + $this->set(compact('translations', 'users')); + } + + function delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for vote', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Vote->delete($id)) { + $this->Session->setFlash(__('Vote deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Vote was not deleted', true)); + $this->redirect(array('action' => 'index')); + } + function admin_index() { + $this->Vote->recursive = 0; + $this->set('votes', $this->paginate()); + } + + function admin_view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid vote', true)); + $this->redirect(array('action' => 'index')); + } + $this->set('vote', $this->Vote->read(null, $id)); + } + + function admin_add() { + if (!empty($this->data)) { + $this->Vote->create(); + if ($this->Vote->save($this->data)) { + $this->Session->setFlash(__('The vote has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The vote could not be saved. Please, try again.', true)); + } + } + $translations = $this->Vote->Translation->find('list'); + $users = $this->Vote->User->find('list'); + $this->set(compact('translations', 'users')); + } + + function admin_edit($id = null) { + if (!$id && empty($this->data)) { + $this->Session->setFlash(__('Invalid vote', true)); + $this->redirect(array('action' => 'index')); + } + if (!empty($this->data)) { + if ($this->Vote->save($this->data)) { + $this->Session->setFlash(__('The vote has been saved', true)); + $this->redirect(array('action' => 'index')); + } else { + $this->Session->setFlash(__('The vote could not be saved. Please, try again.', true)); + } + } + if (empty($this->data)) { + $this->data = $this->Vote->read(null, $id); + } + $translations = $this->Vote->Translation->find('list'); + $users = $this->Vote->User->find('list'); + $this->set(compact('translations', 'users')); + } + + function admin_delete($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid id for vote', true)); + $this->redirect(array('action'=>'index')); + } + if ($this->Vote->delete($id)) { + $this->Session->setFlash(__('Vote deleted', true)); + $this->redirect(array('action'=>'index')); + } + $this->Session->setFlash(__('Vote was not deleted', true)); + $this->redirect(array('action' => 'index')); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/index.php b/code/ryzom/tools/server/www/webtt/app/index.php new file mode 100644 index 000000000..732c01021 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/index.php @@ -0,0 +1,18 @@ + 'Datasources.CsvSource', + * 'path' => '/path/to/file', // Path + * 'extension' => 'csv', // File extension + * 'readonly' => true, // Mark for read only access + * 'recursive' => false // Only false is supported at the moment + * ); + */ + +if (!class_exists('Folder')) { + App::import('Core', 'Folder'); +} + +if (!class_exists('File')) { + App::import('Core', 'File'); +} + +/** + * CSVSource Datasource + * + * @package datasources + * @subpackage datasources.models.datasources + */ +class RawFilesSource extends DataSource { + +/** + * Description + * + * @var string + */ + public $description = 'Directory Contents Data Source'; + +/** + * File Handle + * + * @var mixed + */ + public $handle = false; + +/** + * Default configuration. + * + * @var array + */ + var $_baseConfig = array( + 'datasource' => 'Datasources.RawFilesSource', + 'path' => '.', + 'extension' => 'txt', + 'readonly' => true, + 'recursive' => false); + + var $_schema = array( +// 'files' => array( + 'filename' => array( + 'type' => 'string', + 'null' => false, + 'key' => 'primary', + 'length' => 255 + ), + 'size' => array( + 'type' => 'string', + 'null' => false, + 'length' => 40, + ), + 'modified' => array( + 'type' => 'string', + 'null' => false, + 'length' => 40, + ), + // ) + ); + +/** + * Constructor + * + * @param string $config Configuration array + * @param boolean $autoConnect Automatically connect to / open the file + */ + public function __construct($config = null, $autoConnect = true) { + $this->debug = Configure::read('debug') > 0; + $this->fullDebug = Configure::read('debug') > 1; + parent::__construct($config); + if ($autoConnect) { + $this->connect(); + } + } + +/** + * Connects to the directory using options in the given configuration array. + * + * @return boolean True if the file could be opened. + */ + public function connect() { + $this->connected = false; + + if ($this->config['readonly']) { + $create = false; + $mode = 0; + } else { + $create = true; + $mode = 0777; + } + + $this->connection =& new Folder($this->config['path'], $create, $mode); + if ($this->connection) { + $this->handle = array(); + $this->connected = true; + } + + return $this->connected; + } + +/** + * List available sources + * + * @return array of available files + */ + public function listSources() { + return array('raw_files'); + } + +/** + * Returns a Model description (metadata). + * + * @return mixed + */ + public function describe($model) { + return $this->_schema; + } + +/** + * Close file handle + * + * @return null + */ + public function close() { + if ($this->connected) { + if ($this->handle) { + foreach($this->handle as $h) { + @fclose($h); + } + $this->handle = false; + } + $this->connected = false; + } + } + +/** + * Private method to determine if file is in one of given directories + * + * @return boolean + */ + private function fileInDir($filepath, $dirs) + { + foreach ($dirs as $dir) + { + $dir = $this->connection->realpath($this->config['path']) . DS . $dir; + if ($dir . DS . basename($filepath) === $filepath) + return true; + } + return false; + } + +/** + * Read Data + * + * @param Model $model + * @param array $queryData + * @param integer $recursive Number of levels of association + * @return mixed + */ + public function read(&$model, $queryData = array(), $recursive = null) { + if (isset($queryData["conditions"][$model->alias . ".extension"])) + $extension = preg_quote($queryData["conditions"][$model->alias . ".extension"]); + else + $extension = $this->config['extension']; + + if (isset($queryData["conditions"][$model->alias . ".filename"])) + { + $filename = $queryData["conditions"][$model->alias .".filename"]; + $searchPattern = preg_quote($queryData["conditions"][$model->alias .".filename"], '/'); + } + else + { +// $searchPattern = '.*' . '\.' . preg_quote($extension); + $searchPattern = '.*' . '\.' . $extension; + } + + if (isset($queryData["conditions"][$model->alias . ".dir"])) + { +// $dir = $this->connection->realpath($this->config['path']) . DS . $queryData["conditions"][$model->alias . ".dir"]; + $dir = is_array($dir = $queryData["conditions"][$model->alias . ".dir"]) ? $dir : array($dir); + } + +/* var_dump($queryData);*/ +// var_dump($searchPattern); + + if ($this->config['recursive']) { + $list = $this->connection->findRecursive($searchPattern, true); +/* $this->log($list); + echo "list#\n"; + var_dump($list);*/ + foreach($list as &$item) { + $temp = $item; + $item = array(); + $item["full"] = $temp; + $item["short"] = mb_substr($temp, mb_strlen($this->connection->realpath($this->config['path']) . DS)); + } + unset($item); + } else { + $list = $this->connection->find($searchPattern, true); + foreach($list as &$item) { + $temp = $item; + $item = array(); + $item["full"] = $this->config['path'] . DS .$temp; + $item["short"] = $temp; + } + unset($item); + } + + $resultSet = array(); + foreach ($list as $item) { +/* if (isset($dir) && isset($filename)) + { + echo "dirconcat#\n"; + var_dump($dir . DS . $filename); + echo "itemfull#\n"; + var_dump($item["full"]); + if ($dir . DS . $filename === $item["full"]) + continue; + }*/ + if (isset($dir)) + if (!$this->fileInDir($item["full"], $dir)) + continue; + $file = new File($path = $this->config['path'] . DS . $item["short"], false); +// var_dump($item); +// $item = preg_replace('/' . $extPattern . '$/i', '', $item); + $resultSet[] = array( + $model->alias => array( + 'filename' => $item["short"], + 'size' => $file->size(), + 'modified' => $file->lastChange(), + ), + ); + } + if ($model->findQueryType === 'count') { + return array(array(array('count' => count($resultSet)))); + } + + return $resultSet; + } + +/** + * Calculate + * + * @param Model $model + * @param mixed $func + * @param array $params + * @return array with the field name with records count + */ + public function calculate(&$model, $func, $params = array()) { + return array('count'); + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/file_identifier.php b/code/ryzom/tools/server/www/webtt/app/models/file_identifier.php new file mode 100644 index 000000000..1df085930 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/file_identifier.php @@ -0,0 +1,26 @@ + array( + 'className' => 'ImportedTranslationFile', + 'foreignKey' => 'imported_translation_file_id', + 'conditions' => '', + 'fields' => '', +// 'order' => '' + ), + 'Identifier' => array( + 'className' => 'Identifier', + 'foreignKey' => 'identifier_id', + 'conditions' => '', + 'fields' => '', +// 'order' => '' + ) + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/identifier.php b/code/ryzom/tools/server/www/webtt/app/models/identifier.php new file mode 100644 index 000000000..5f4d2da69 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/identifier.php @@ -0,0 +1,133 @@ + array( + 'numeric' => array( + 'rule' => array('numeric'), + 'message' => 'Your custom message here', + 'allowEmpty' => false, + //'required' => true, + //'last' => false, // Stop validation after this rule + //'on' => 'create', // Limit validation to 'create' or 'update' operations + ), + ),*/ + 'identifier' => array( + 'A_Za_z0_9' => array( + 'rule' => '/[A-Za-z0-9_@]+/', + 'message' => 'Identifier must consist only of the following caracteres: "A-Z", "a-z", "0-9", "@" and "_"', + //'allowEmpty' => false, + //'required' => false, + //'last' => false, // Stop validation after this rule + //'on' => 'create', // Limit validation to 'create' or 'update' operations + ), + ), + ); + + var $scaffoldForbiddenActions = array("add", "admin_add", "edit", "admin_edit", "delete", "admin_delete"); + + //The Associations below have been created with all possible keys, those that are not needed can be removed + + var $belongsTo = array( +/* 'Language' => array( + 'className' => 'Language', + 'foreignKey' => 'language_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ),*/ + 'TranslationFile' => array( + 'className' => 'TranslationFile', + 'foreignKey' => 'translation_file_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), + ); + + var $hasOne = array( + 'BestTranslation' => array( + 'className' => 'Translation', + 'foreignKey' => 'identifier_id', + 'dependent' => false, + 'conditions' => array('BestTranslation.best' => true), + 'fields' => '', + 'order' => '', + ), + ); + + var $hasMany = array( + 'Translation' => array( + 'className' => 'Translation', + 'foreignKey' => 'identifier_id', + 'dependent' => true, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + 'Comment' => array( + 'className' => 'Comment', + 'foreignKey' => 'identifier_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + 'FileIdentifier' => array( + 'className' => 'FileIdentifier', + 'foreignKey' => 'identifier_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + 'IdentifierColumn' => array( + 'className' => 'IdentifierColumn', + 'foreignKey' => 'identifier_id', + 'dependent' => true, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + ); + + function withoutBestTranslation($conditions = array()) + { +/* $this->contain(array( + 'FileIdentifier' => array('ImportedTranslationFile' => array( + 'conditions' => array('ImportedTranslationFile.id' => 248) + )), + )); + + $res = $this->find('all', array('conditions' => array('Identifier.id' => array(125219, 131609, 67133))));*/ +// $fileIdentifier_ids = $this->FileIdentifier->find('list', array('fields' => array('FileIdentifier.id', 'FileIdentifier.id'), 'conditions' => array('FileIdentifier.imported_translation_file_id' => 248))); + // TOTHINK: try to achieve that with Linkable behaviour + if (isset($conditions['ImportedTranslationFile.id'])) + return $identifier_ids = $this->FileIdentifier->find('list', array('fields' => array('Identifier.id', 'Identifier.id'), 'conditions' => array('FileIdentifier.imported_translation_file_id' => $conditions['ImportedTranslationFile.id']), 'recursive' => 1)); + else + return false; + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/imported_translation_file.php b/code/ryzom/tools/server/www/webtt/app/models/imported_translation_file.php new file mode 100644 index 000000000..4a816da63 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/imported_translation_file.php @@ -0,0 +1,56 @@ + array( + 'className' => 'Language', + 'foreignKey' => 'language_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), + 'TranslationFile' => array( + 'className' => 'TranslationFile', + 'foreignKey' => 'translation_file_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), + ); + + var $hasMany = array( + 'FileIdentifier' => array( + 'className' => 'FileIdentifier', + 'foreignKey' => 'imported_translation_file_id', + 'dependent' => true, + 'conditions' => '', + 'fields' => '', + 'order' => 'FileIdentifier.id', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ) + ); + + var $hasOne = array( + 'RawFile' => array( + 'className' => 'RawFile', + 'foreignKey' => 'filename', + 'dependand' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + ), + ); + +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/language.php b/code/ryzom/tools/server/www/webtt/app/models/language.php new file mode 100644 index 000000000..bd82c0fcb --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/language.php @@ -0,0 +1,51 @@ + array( + 'className' => 'TranslationFile', + 'foreignKey' => 'language_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + 'ImportedTranslationFile' => array( + 'className' => 'ImportedTranslationFile', + 'foreignKey' => 'language_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + 'Identifier' => array( + 'className' => 'Identifier', + 'foreignKey' => 'language_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + ); + +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/raw_file.php b/code/ryzom/tools/server/www/webtt/app/models/raw_file.php new file mode 100644 index 000000000..8911bab90 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/raw_file.php @@ -0,0 +1,152 @@ + array( + 'className' => 'ImportedTranslationFile', + 'foreignKey' => 'filename', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), + ); +/* var $hasOne = array( + 'FileIdentifier' => array( + 'className' => 'FileIdentifier', + 'foreignKey' => 'translation_file_id', + 'dependent' => true, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ) + );*/ + + public function open($dir, $filename, $write = false) + { + $this->_currentFile = null; + $this->_currentFileLastModified = null; + + $ds = $this->getDataSource(); + $file = new File($filepath = $ds->config['path'] . DS . $dir . DS . $filename, false); + if (!$file) + return false; + if (!$file->readable()) + return false; + if ($write && !$file->writable()) + return false; +// var_dump($filename); + $this->_currentFile = $file; + $this->_currentFileLastChange = $file->lastChange(); + return $file; + } + + public function parseFile() + { +// var_dump($this->_currentFile); + if (!$this->_currentFile) + return false; + + // TODO: file types array with filenames regex + if ( + preg_match('|^([a-z]{2})_diff_[A-F0-9]{8}\.uxt$|', $this->_currentFile->name, $matches) + || preg_match('|^([a-z]{2})\.uxt$|', $this->_currentFile->name, $matches) + || preg_match('|^r2_([a-z]{2})\.uxt$|', $this->_currentFile->name, $matches) + ) + { + App::import("Vendor","StringParser", array("file" => 'StringParser.php')); + $parser = $this->_parser = new StringParser(); + } + else if ( + preg_match('|^phrase_([a-z]{2})_diff_[A-F0-9]{8}\.txt$|', $this->_currentFile->name, $matches) + || preg_match('|^phrase_([a-z]{2})\.txt$|', $this->_currentFile->name, $matches) + ) + { + App::import("Vendor","PhraseParser", array("file" => 'PhraseParser.php')); + $parser = $this->_parser = new PhraseParser(); + } + else if (preg_match('|^.*_words_([a-z]{2})_diff_[A-F0-9]{8}\..*$|', $this->_currentFile->name, $matches) + || preg_match('|^.*_words_([a-z]{2})\..*$|', $this->_currentFile->name, $matches)) + { + App::import("Vendor","SheetParser", array("file" => 'SheetParser.php')); + $parser = $this->_parser = new SheetParser(); + } + else + { + return false; + } + $entities = $parser->parseFile($this->_currentFile->read()); + return $entities; + } + + public function buildFile($entities) + { +// var_dump($this->_currentFile); + if (!$this->_currentFile) + return false; + + // TODO: file types array with filenames regex + if ( + preg_match('|^([a-z]{2})_diff_[A-F0-9]{8}\.uxt$|', $this->_currentFile->name, $matches) + || preg_match('|^([a-z]{2})\.uxt$|', $this->_currentFile->name, $matches) + || preg_match('|^r2_([a-z]{2})\.uxt$|', $this->_currentFile->name, $matches) + ) + { + App::import("Vendor","StringParser", array("file" => 'StringParser.php')); + $parser = $this->_parser = new StringParser(); + } + else if ( + preg_match('|^phrase_([a-z]{2})_diff_[A-F0-9]{8}\.txt$|', $this->_currentFile->name, $matches) + || preg_match('|^phrase_([a-z]{2})\.txt$|', $this->_currentFile->name, $matches) + ) + { + App::import("Vendor","PhraseParser", array("file" => 'PhraseParser.php')); + $parser = $this->_parser = new PhraseParser(); + } + else if (preg_match('|^.*_words_([a-z]{2})_diff_[A-F0-9]{8}\..*$|', $this->_currentFile->name, $matches) + || preg_match('|^.*_words_([a-z]{2})\..*$|', $this->_currentFile->name, $matches)) + { + App::import("Vendor","SheetParser", array("file" => 'SheetParser.php')); + $parser = $this->_parser = new SheetParser(); + } + else + { + return false; + } + $content = $parser->buildFile($entities); + $ret = $this->_currentFile->write($content); + return $ret; + } + + + public function getLanguageCode($filename) + { +// var_dump($filename); + if (preg_match('|^([a-z]{2})_diff_[A-F0-9]{8}\.uxt$|', $filename, $matches)) + return $matches[1]; + else if (preg_match('|^([a-z]{2})\.uxt$|', $filename, $matches)) + return $matches[1]; + else if (preg_match('|^r2_([a-z]{2})\.uxt$|', $filename, $matches)) + return $matches[1]; + else if (preg_match('|^phrase_([a-z]{2})_diff_[A-F0-9]{8}\..*$|', $filename, $matches)) + return $matches[1]; + else if (preg_match('|^phrase_([a-z]{2})\..*$|', $filename, $matches)) + return $matches[1]; + else if (preg_match('|^.*_words_([a-z]{2})_diff_[A-F0-9]{8}\..*$|', $filename, $matches)) + return $matches[1]; + else if (preg_match('|^.*_words_([a-z]{2})\..*$|', $filename, $matches)) + return $matches[1]; + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/translation.php b/code/ryzom/tools/server/www/webtt/app/models/translation.php new file mode 100644 index 000000000..6c8ecafdc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/translation.php @@ -0,0 +1,87 @@ + "fk", "index" => "fk"); + //The Associations below have been created with all possible keys, those that are not needed can be removed + + var $belongsTo = array( + 'Identifier' => array( + 'className' => 'Identifier', + 'foreignKey' => 'identifier_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), + 'IdentifierColumn' => array( + 'className' => 'IdentifierColumn', + 'foreignKey' => 'identifier_column_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), + 'User' => array( + 'className' => 'User', + 'foreignKey' => 'user_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ) + ); + + var $hasMany = array( + 'Vote' => array( + 'className' => 'Vote', + 'foreignKey' => 'translation_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), +/* 'Comment' => array( + 'className' => 'Comment', + 'foreignKey' => 'translation_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ),*/ + ); + + function setBest() + { + if (!$this->id) + return false; + $this->read(); + if (!isset($this->data['Translation']['identifier_id'])) + return false; + + // set best on chosen translation + $ret = $this->save(array('best' => 1)); + $best_id = $this->id; + + // reset best on other translations + $ret = $this->updateAll(array('Translation.best' => 0), array( + 'AND' => array( + 'Translation.identifier_id' => $ret['Translation']['identifier_id'], + 'Translation.id !=' => $best_id, + ), + )); + $this->log($ret); + // TODO: test! + + return $this->id; + } +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/user.php b/code/ryzom/tools/server/www/webtt/app/models/user.php new file mode 100644 index 000000000..0daa4b852 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/user.php @@ -0,0 +1,53 @@ + array( + 'alphaNumeric', +/* 'uniqueCheck' => array( + 'rule' => 'isUnique', + 'message' => 'That username has already been taken.', + ),*/ + ), + 'email' => array('rule' => 'email', 'message' => 'Wrong format'), + 'name' => array('rule' => 'notEmpty'), +// 'password' => array('rule' => 'notEmpty'), + 'passwd' => array('rule' => 'notEmpty'), + ); + + var $scaffoldForbiddenActions = array("add", "edit", "delete"); + + //The Associations below have been created with all possible keys, those that are not needed can be removed + + var $hasMany = array( + 'Translation' => array( + 'className' => 'Translation', + 'foreignKey' => 'user_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ), + 'Vote' => array( + 'className' => 'Vote', + 'foreignKey' => 'user_id', + 'dependent' => false, + 'conditions' => '', + 'fields' => '', + 'order' => '', + 'limit' => '', + 'offset' => '', + 'exclusive' => '', + 'finderQuery' => '', + 'counterQuery' => '' + ) + ); + +} diff --git a/code/ryzom/tools/server/www/webtt/app/models/vote.php b/code/ryzom/tools/server/www/webtt/app/models/vote.php new file mode 100644 index 000000000..f03d6b910 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/models/vote.php @@ -0,0 +1,25 @@ + array( + 'className' => 'Translation', + 'foreignKey' => 'translation_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ), + 'User' => array( + 'className' => 'User', + 'foreignKey' => 'user_id', + 'conditions' => '', + 'fields' => '', + 'order' => '' + ) + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/plugins/empty b/code/ryzom/tools/server/www/webtt/app/plugins/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/behaviors/empty b/code/ryzom/tools/server/www/webtt/app/tests/cases/behaviors/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/components/empty b/code/ryzom/tools/server/www/webtt/app/tests/cases/components/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/empty b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/file_identifiers_controller.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/file_identifiers_controller.test.php new file mode 100644 index 000000000..0c7298f47 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/file_identifiers_controller.test.php @@ -0,0 +1,66 @@ +redirectUrl = $url; + } +} + +class FileIdentifiersControllerTestCase extends CakeTestCase { + var $fixtures = array('app.file_identifier', 'app.translation_file', 'app.language', 'app.identifier', 'app.translation', 'app.user', 'app.vote'); + + function startTest() { + $this->FileIdentifiers =& new TestFileIdentifiersController(); + $this->FileIdentifiers->constructClasses(); + } + + function endTest() { + unset($this->FileIdentifiers); + ClassRegistry::flush(); + } + + function testIndex() { + + } + + function testView() { + + } + + function testAdd() { + + } + + function testEdit() { + + } + + function testDelete() { + + } + + function testAdminIndex() { + + } + + function testAdminView() { + + } + + function testAdminAdd() { + + } + + function testAdminEdit() { + + } + + function testAdminDelete() { + + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/identifiers_controller.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/identifiers_controller.test.php new file mode 100644 index 000000000..72e3d7346 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/identifiers_controller.test.php @@ -0,0 +1,66 @@ +redirectUrl = $url; + } +} + +class IdentifiersControllerTestCase extends CakeTestCase { + var $fixtures = array('app.identifier', 'app.language', 'app.translation_file', 'app.file_identifier', 'app.translation', 'app.user', 'app.vote'); + + function startTest() { + $this->Identifiers =& new TestIdentifiersController(); + $this->Identifiers->constructClasses(); + } + + function endTest() { + unset($this->Identifiers); + ClassRegistry::flush(); + } + + function testIndex() { + + } + + function testView() { + + } + + function testAdd() { + + } + + function testEdit() { + + } + + function testDelete() { + + } + + function testAdminIndex() { + + } + + function testAdminView() { + + } + + function testAdminAdd() { + + } + + function testAdminEdit() { + + } + + function testAdminDelete() { + + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/languages_controller.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/languages_controller.test.php new file mode 100644 index 000000000..1cc5063e8 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/languages_controller.test.php @@ -0,0 +1,66 @@ +redirectUrl = $url; + } +} + +class LanguagesControllerTestCase extends CakeTestCase { + var $fixtures = array('app.language', 'app.identifier', 'app.translation', 'app.user', 'app.vote', 'app.translation_file'); + + function startTest() { + $this->Languages =& new TestLanguagesController(); + $this->Languages->constructClasses(); + } + + function endTest() { + unset($this->Languages); + ClassRegistry::flush(); + } + + function testIndex() { + + } + + function testView() { + + } + + function testAdd() { + + } + + function testEdit() { + + } + + function testDelete() { + + } + + function testAdminIndex() { + + } + + function testAdminView() { + + } + + function testAdminAdd() { + + } + + function testAdminEdit() { + + } + + function testAdminDelete() { + + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/translation_files_controller.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/translation_files_controller.test.php new file mode 100644 index 000000000..19f94096d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/translation_files_controller.test.php @@ -0,0 +1,66 @@ +redirectUrl = $url; + } +} + +class TranslationFilesControllerTestCase extends CakeTestCase { + var $fixtures = array('app.translation_file', 'app.language', 'app.identifier', 'app.translation', 'app.user', 'app.vote', 'app.comment', 'app.file_identifier', 'app.imported_translation_file', 'app.raw_file'); + + function startTest() { + $this->TranslationFiles =& new TestTranslationFilesController(); + $this->TranslationFiles->constructClasses(); + } + + function endTest() { + unset($this->TranslationFiles); + ClassRegistry::flush(); + } + + function testIndex() { + + } + + function testView() { + + } + + function testAdd() { + + } + + function testEdit() { + + } + + function testDelete() { + + } + + function testAdminIndex() { + + } + + function testAdminView() { + + } + + function testAdminAdd() { + + } + + function testAdminEdit() { + + } + + function testAdminDelete() { + + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/translations_controller.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/translations_controller.test.php new file mode 100644 index 000000000..aaeb1ec5a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/translations_controller.test.php @@ -0,0 +1,66 @@ +redirectUrl = $url; + } +} + +class TranslationsControllerTestCase extends CakeTestCase { + var $fixtures = array('app.translation', 'app.identifier', 'app.translation_file', 'app.language', 'app.user', 'app.vote'); + + function startTest() { + $this->Translations =& new TestTranslationsController(); + $this->Translations->constructClasses(); + } + + function endTest() { + unset($this->Translations); + ClassRegistry::flush(); + } + + function testIndex() { + + } + + function testView() { + + } + + function testAdd() { + + } + + function testEdit() { + + } + + function testDelete() { + + } + + function testAdminIndex() { + + } + + function testAdminView() { + + } + + function testAdminAdd() { + + } + + function testAdminEdit() { + + } + + function testAdminDelete() { + + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/users_controller.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/users_controller.test.php new file mode 100644 index 000000000..3e9700388 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/users_controller.test.php @@ -0,0 +1,66 @@ +redirectUrl = $url; + } +} + +class UsersControllerTestCase extends CakeTestCase { + var $fixtures = array('app.user', 'app.translation', 'app.identifier', 'app.translation_file', 'app.language', 'app.vote'); + + function startTest() { + $this->Users =& new TestUsersController(); + $this->Users->constructClasses(); + } + + function endTest() { + unset($this->Users); + ClassRegistry::flush(); + } + + function testIndex() { + + } + + function testView() { + + } + + function testAdd() { + + } + + function testEdit() { + + } + + function testDelete() { + + } + + function testAdminIndex() { + + } + + function testAdminView() { + + } + + function testAdminAdd() { + + } + + function testAdminEdit() { + + } + + function testAdminDelete() { + + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/votes_controller.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/votes_controller.test.php new file mode 100644 index 000000000..027661fb2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/controllers/votes_controller.test.php @@ -0,0 +1,66 @@ +redirectUrl = $url; + } +} + +class VotesControllerTestCase extends CakeTestCase { + var $fixtures = array('app.vote', 'app.translation', 'app.identifier', 'app.translation_file', 'app.language', 'app.user'); + + function startTest() { + $this->Votes =& new TestVotesController(); + $this->Votes->constructClasses(); + } + + function endTest() { + unset($this->Votes); + ClassRegistry::flush(); + } + + function testIndex() { + + } + + function testView() { + + } + + function testAdd() { + + } + + function testEdit() { + + } + + function testDelete() { + + } + + function testAdminIndex() { + + } + + function testAdminView() { + + } + + function testAdminAdd() { + + } + + function testAdminEdit() { + + } + + function testAdminDelete() { + + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/helpers/empty b/code/ryzom/tools/server/www/webtt/app/tests/cases/helpers/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/empty b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/file_identifier.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/file_identifier.test.php new file mode 100644 index 000000000..0b6374de0 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/file_identifier.test.php @@ -0,0 +1,17 @@ +FileIdentifier =& ClassRegistry::init('FileIdentifier'); + } + + function endTest() { + unset($this->FileIdentifier); + ClassRegistry::flush(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/identifier.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/identifier.test.php new file mode 100644 index 000000000..45d94d4a8 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/identifier.test.php @@ -0,0 +1,17 @@ +Identifier =& ClassRegistry::init('Identifier'); + } + + function endTest() { + unset($this->Identifier); + ClassRegistry::flush(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/language.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/language.test.php new file mode 100644 index 000000000..e4d2251aa --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/language.test.php @@ -0,0 +1,17 @@ +Language =& ClassRegistry::init('Language'); + } + + function endTest() { + unset($this->Language); + ClassRegistry::flush(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/translation.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/translation.test.php new file mode 100644 index 000000000..534258df9 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/translation.test.php @@ -0,0 +1,17 @@ +Translation =& ClassRegistry::init('Translation'); + } + + function endTest() { + unset($this->Translation); + ClassRegistry::flush(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/translation_file.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/translation_file.test.php new file mode 100644 index 000000000..cb5d08ecd --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/translation_file.test.php @@ -0,0 +1,17 @@ +TranslationFile =& ClassRegistry::init('TranslationFile'); + } + + function endTest() { + unset($this->TranslationFile); + ClassRegistry::flush(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/user.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/user.test.php new file mode 100644 index 000000000..36660249d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/user.test.php @@ -0,0 +1,17 @@ +User =& ClassRegistry::init('User'); + } + + function endTest() { + unset($this->User); + ClassRegistry::flush(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/cases/models/vote.test.php b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/vote.test.php new file mode 100644 index 000000000..0c42bc5ec --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/cases/models/vote.test.php @@ -0,0 +1,17 @@ +Vote =& ClassRegistry::init('Vote'); + } + + function endTest() { + unset($this->Vote); + ClassRegistry::flush(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/empty b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/file_identifier_fixture.php b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/file_identifier_fixture.php new file mode 100644 index 000000000..6fca71e96 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/file_identifier_fixture.php @@ -0,0 +1,31 @@ + array('type' => 'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'translation_file_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'command' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 50, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'translation_index' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'identifier_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'reference_string' => array('type' => 'text', 'null' => true, 'default' => NULL, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)), + 'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'MyISAM') + ); + + var $records = array( + array( + 'id' => 1, + 'translation_file_id' => 1, + 'command' => 'Lorem ipsum dolor sit amet', + 'translation_index' => 1, + 'identifier_id' => 1, + 'reference_string' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.', + 'created' => '2011-05-31 16:07:59', + 'modified' => '2011-05-31 16:07:59' + ), + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/identifier_fixture.php b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/identifier_fixture.php new file mode 100644 index 000000000..156047ae6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/identifier_fixture.php @@ -0,0 +1,31 @@ + array('type' => 'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'translation_file_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'translation_index' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'identifier' => array('type' => 'string', 'null' => true, 'default' => NULL, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'reference_string' => array('type' => 'text', 'null' => true, 'default' => NULL, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'translated' => array('type' => 'boolean', 'null' => true, 'default' => '0'), + 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)), + 'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'MyISAM') + ); + + var $records = array( + array( + 'id' => 1, + 'translation_file_id' => 1, + 'translation_index' => 1, + 'identifier' => 'Lorem ipsum dolor sit amet', + 'reference_string' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.', + 'translated' => 1, + 'created' => '2011-05-29 19:17:37', + 'modified' => '2011-05-29 19:17:37' + ), + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/language_fixture.php b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/language_fixture.php new file mode 100644 index 000000000..91fe7fb76 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/language_fixture.php @@ -0,0 +1,25 @@ + array('type' => 'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'name' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 50, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'code' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 10, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)), + 'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'MyISAM') + ); + + var $records = array( + array( + 'id' => 1, + 'name' => 'Lorem ipsum dolor sit amet', + 'code' => 'Lorem ip', + 'created' => '2011-05-31 15:48:42', + 'modified' => '2011-05-31 15:48:42' + ), + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/translation_file_fixture.php b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/translation_file_fixture.php new file mode 100644 index 000000000..bd562dbd4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/translation_file_fixture.php @@ -0,0 +1,25 @@ + array('type' => 'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'language_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'filename_template' => array('type' => 'string', 'null' => true, 'default' => NULL, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)), + 'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'MyISAM') + ); + + var $records = array( + array( + 'id' => 1, + 'language_id' => 1, + 'filename_template' => 'Lorem ipsum dolor sit amet', + 'created' => '2011-07-04 13:04:11', + 'modified' => '2011-07-04 13:04:11' + ), + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/translation_fixture.php b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/translation_fixture.php new file mode 100644 index 000000000..fbe4bdaca --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/translation_fixture.php @@ -0,0 +1,27 @@ + array('type' => 'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'identifier_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'translation_text' => array('type' => 'text', 'null' => true, 'default' => NULL, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'user_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)), + 'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'MyISAM') + ); + + var $records = array( + array( + 'id' => 1, + 'identifier_id' => 1, + 'translation_text' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.', + 'user_id' => 1, + 'created' => '2011-05-29 19:19:41', + 'modified' => '2011-05-29 19:19:41' + ), + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/user_fixture.php b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/user_fixture.php new file mode 100644 index 000000000..5e0adfb2d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/user_fixture.php @@ -0,0 +1,23 @@ + array('type' => 'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'name' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 100, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'), + 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)), + 'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'MyISAM') + ); + + var $records = array( + array( + 'id' => 1, + 'name' => 'Lorem ipsum dolor sit amet', + 'created' => '2011-05-29 19:20:07', + 'modified' => '2011-05-29 19:20:07' + ), + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/fixtures/vote_fixture.php b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/vote_fixture.php new file mode 100644 index 000000000..cbe5389d6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/tests/fixtures/vote_fixture.php @@ -0,0 +1,25 @@ + array('type' => 'integer', 'null' => false, 'default' => NULL, 'length' => 10, 'key' => 'primary'), + 'translation_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'user_id' => array('type' => 'integer', 'null' => true, 'default' => NULL, 'length' => 10), + 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), + 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)), + 'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'MyISAM') + ); + + var $records = array( + array( + 'id' => 1, + 'translation_id' => 1, + 'user_id' => 1, + 'created' => '2011-05-29 21:11:49', + 'modified' => '2011-05-29 21:11:49' + ), + ); +} diff --git a/code/ryzom/tools/server/www/webtt/app/tests/groups/empty b/code/ryzom/tools/server/www/webtt/app/tests/groups/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tmp/cache/models/empty b/code/ryzom/tools/server/www/webtt/app/tmp/cache/models/empty new file mode 100755 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tmp/cache/persistent/empty b/code/ryzom/tools/server/www/webtt/app/tmp/cache/persistent/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tmp/sessions/empty b/code/ryzom/tools/server/www/webtt/app/tmp/sessions/empty new file mode 100755 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/tmp/tests/empty b/code/ryzom/tools/server/www/webtt/app/tmp/tests/empty new file mode 100755 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/UxtParser.php b/code/ryzom/tools/server/www/webtt/app/vendors/UxtParser.php new file mode 100644 index 000000000..520801069 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/vendors/UxtParser.php @@ -0,0 +1,255 @@ +################################\n"; + var_dump($str); + var_dump($arr); + echo "\n";*/ + return $arr; + } + + function parseFile($file) + { + $parsedEnt = array(); + $newEnt = false; + $prevStringLine = false; + $entities = array(); + +// $file = file_get_contents($this->pipeline_directory . $file); +// var_dump(mb_substr($file, 0,3)); +// var_dump(substr($file, 0,3)); +// var_dump($file); + $file = $this->removeBOM($file); +// var_dump($file); + $file = $this->removeComments($file); +// var_dump($file); + $lines = explode("\n", $file); + if ($this->debug) + { + echo "
\n\n";
+		}
+		$line_no=1;
+		foreach ($lines as $line)
+		{
+			if ($this->debug)
+			{
+				echo "\n\t#################### LINE NUMBER " . $line_no++ . "\n\n";
+			}
+
+//			var_dump($line);
+			$line = rtrim($line);
+			$parsedLine = $this->parseLine($line);
+
+			if ($this->debug)
+			{
+				echo "%%%% parsedLine\n";
+				var_dump($parsedLine);
+				echo "\n";
+			
+				echo "%%%% prevStringLine\n";
+				var_dump($prevStringLine);
+				echo "\n";
+			}
+
+			if (!$parsedLine)
+				continue;
+
+			// if line start with diff (diff files) or hash_value (translated files) and before was line with translation, then we start new ent
+
+			if ($prevStringLine && (
+					($parsedLine["type"] == "diff" && $parsedEnt) || ($parsedLine["type"] == "hash_value" && $parsedEnt)
+				))
+			{
+/*				echo "%%%% prevStringLine %%%%%\n";
+				var_dump($parsedEnt);*/
+				$newEnt = true;
+			}
+
+			if ($newEnt)
+			{
+				if ($this->debug)			
+				{
+					echo "\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
+					echo "\t%%%% newEnt %%%%%%%%% newEnt %%%%%%%%% newEnt %%%%%%%%% newEnt %%%%%\n";
+					echo "\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n";
+					var_dump($parsedEnt);
+				}
+				if (!isset($parsedEnt["diff"]) && !isset($parsedEnt["index"]))
+					$parsedEnt["index"] = $parsedEnt["internal_index"];
+
+				$entities[] = $parsedEnt;
+				$parsedEnt =array();
+				$newEnt = false;
+			}
+
+			if ($parsedLine["type"] == "internal_index")
+					$parsedEnt["internal_index"] = $parsedLine["index"];
+
+			if ($parsedLine["type"] == "string")
+			{
+				$prevStringLine = true;
+
+				if ($this->debug)			
+				{
+					echo "%%%% parsedEnt %%%%%\n";
+					var_dump($parsedEnt);
+
+//					echo "%%%% parsedLine %%%%%\n";
+//					var_dump($parsedLine);
+				}
+
+				if (!$parsedLine['identifier'])
+				{
+					if ($this->debug) echo "ZLACZENIE \n";
+					if ($this->debug && !isset($parsedEnt['string']))
+					{
+						echo "!isset parsedEnt['string']\n";
+						var_dump($line);
+						var_dump($parsedEnt);
+						var_dump($parsedLine);
+					}
+					$parsedEnt['string'] .= $parsedLine['string'] . "\n";
+				}
+				else
+				{
+					if ($this->debug) echo "DODANIE \n";
+					$parsedEnt += $parsedLine;
+					$parsedEnt['string'] .= "\n";
+				}
+
+				if ($this->debug)			
+				{
+					echo "%%%% parsedEnt after %%%%%\n";
+					var_dump($parsedEnt);
+				}
+			}
+			else
+				$prevStringLine = false;
+
+			if ($parsedLine["type"] == "diff")
+			{
+				$parsedEnt["diff"] = $parsedLine["command"];
+				$parsedEnt["index"] = $parsedLine["index"];
+			}
+		}
+		if ($parsedEnt)
+		{
+			if (!isset($parsedEnt["diff"]) && !isset($parsedEnt["index"]))
+				$parsedEnt["index"] = $parsedEnt["internal_index"];
+
+			$entities[] = $parsedEnt;
+		}
+
+		if ($this->debug)			
+		{
+			echo "
";
+			var_dump($entities);
+			echo "
\n"; + } + return $entities; + } +} +?> \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/shells/tasks/empty b/code/ryzom/tools/server/www/webtt/app/vendors/shells/tasks/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/form.ctp b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/form.ctp new file mode 100644 index 000000000..373f86fdc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/form.ctp @@ -0,0 +1,83 @@ + +
+
+ +

+ Actions +

+
+
+ + $data) { + foreach ($data as $alias => $details) { + echo "\n\t\t\t
".Inflector::humanize($details['controller'])."
"; + echo "\n\t\t\t
    \n"; + if ($details['controller'] != $this->name && !in_array($details['controller'], $done)) { + echo "\t\t\t\t
  • Html->link(sprintf(__('List %s', true), __('" . Inflector::humanize($details['controller']) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'index')); ?>
  • \n"; + echo "\t\t\t\t
  • Html->link(sprintf(__('New %s', true), __('" . Inflector::humanize(Inflector::underscore($alias)) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'add')); ?>
  • \n"; + $done[] = $details['controller']; + } + echo "\t\t\t
\n"; + } + } + ?> +
+
+
+ +
+

";?>

+ +
+ Form->create('{$modelClass}');?>\n";?> +
+ ";?> + Form->input('{$field}');\n"; + } + } + if (!empty($associations['hasAndBelongsToMany'])) { + foreach ($associations['hasAndBelongsToMany'] as $assocName => $assocData) { + echo "\t\techo \$this->Form->input('{$assocName}');\n"; + } + } + echo "\t?>\n"; + ?> +
+ Form->end(__('Submit', true));?>\n"; + ?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/home.ctp b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/home.ctp new file mode 100644 index 000000000..89e973e25 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/home.ctp @@ -0,0 +1,89 @@ +
+ +Sweet, \"" . Inflector::humanize($app) . "\" got Baked by CakePHP!\n"; +$output .=" + 0): + Debugger::checkSecurityKeys(); +endif; +?> +

+'; + __('Your tmp directory is writable.'); + echo ''; + else: + echo ''; + __('Your tmp directory is NOT writable.'); + echo ''; + endif; +?> +

+

+'; + printf(__('The %s is being used for caching. To change the config edit APP/config/core.php ', true), ''. \$settings['engine'] . 'Engine'); + echo ''; + else: + echo ''; + __('Your cache is NOT working. Please check the settings in APP/config/core.php'); + echo ''; + endif; +?> +

+

+'; + __('Your database configuration file is present.'); + \$filePresent = true; + echo ''; + else: + echo ''; + __('Your database configuration file is NOT present.'); + echo '
'; + __('Rename config/database.php.default to config/database.php'); + echo '
'; + endif; +?> +

+getDataSource('default'); +?> +

+isConnected()): + echo ''; + __('Cake is able to connect to the database.'); + echo ''; + else: + echo ''; + __('Cake is NOT able to connect to the database.'); + echo ''; + endif; +?> +

\n"; +$output .= "\n"; +$output .= "

\n"; +$output .= "

\n"; +$output .= "', APP . 'views' . DS . 'layouts' . DS . 'default.ctp.
', APP . 'webroot' . DS . 'css');\n"; +$output .= "?>\n"; +$output .= "

\n"; +?> + +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/index.ctp b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/index.ctp new file mode 100644 index 000000000..1a98eba2a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/index.ctp @@ -0,0 +1,126 @@ + +
+
+ +

+ Actions +

+
+
+ + $data) { + foreach ($data as $alias => $details) { + echo "\n\t\t\t
".Inflector::humanize($details['controller'])."
"; + echo "\n\t\t\t
    \n"; + if ($details['controller'] != $this->name && !in_array($details['controller'], $done)) { + echo "\t\t\t\t
  • Html->link(sprintf(__('List %s', true), __('" . Inflector::humanize($details['controller']) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'index')); ?>
  • \n"; + echo "\t\t\t\t
  • Html->link(sprintf(__('New %s', true), __('" . Inflector::humanize(Inflector::underscore($alias)) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'add')); ?>
  • \n"; + $done[] = $details['controller']; + } + echo "\t\t\t
\n"; + } + } + ?> +
+
+
+ +
+

";?>

+ + + + + tableHeaders(array("; + + foreach($fields as $field) { + echo "\$paginator->sort('{$field}'),"; + } + echo "__('Actions', true),"; + echo "));\n"; + + echo "echo ''.\$tableHeaders.''; ?>\n\n"; + + //// TABLE ROWS + + echo "\n"; + echo "\t>\n"; + foreach ($fields as $field) { + $isKey = false; + if (!empty($associations['belongsTo'])) { + foreach ($associations['belongsTo'] as $alias => $details) { + if ($field === $details['foreignKey']) { + $isKey = true; + echo "\t\t\n"; + break; + } + } + } + if ($isKey !== true) { + echo "\t\t\n"; + } + } + + echo "\t\t\n"; + echo "\t\n"; + + echo "\n"; + + //// TABLE FOOTER + echo "'.\$tableHeaders.''; ?>"; + ?> +
\n\t\t\tHtml->link(\${$singularVar}['{$alias}']['{$details['displayField']}'], array('controller' => '{$details['controller']}', 'action' => 'view', \${$singularVar}['{$alias}']['{$details['primaryKey']}'])); ?>\n\t\t \n"; + echo "\t\t\tHtml->link(__('View', true), array('action' => 'view', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?>\n"; + echo "\t\t\tHtml->link(__('Edit', true), array('action' => 'edit', \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?>\n"; + echo "\t\t\tHtml->link(__('Delete', true), array('action' => 'delete', \${$singularVar}['{$modelClass}']['{$primaryKey}']), null, sprintf(__('Are you sure you want to delete # %s?', true), \${$singularVar}['{$modelClass}']['{$primaryKey}'])); ?>\n"; + echo "\t\t
+ + + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>";?> +

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?>\n";?> + | Paginator->numbers();?>\n"?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?>\n";?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/view.ctp b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/view.ctp new file mode 100644 index 000000000..fa7a17221 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/960grid/views/view.ctp @@ -0,0 +1,184 @@ + +
+
+ +

+ Actions +

+
+
+ + $data) { + foreach ($data as $alias => $details) { + echo "\n\t\t\t
".Inflector::humanize($details['controller'])."
"; + echo "\n\t\t\t
    \n"; + if ($details['controller'] != $this->name && !in_array($details['controller'], $done)) { + echo "\t\t\t\t
  • Html->link(sprintf(__('List %s', true), __('" . Inflector::humanize($details['controller']) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'index')); ?>
  • \n"; + echo "\t\t\t\t
  • Html->link(sprintf(__('New %s', true), __('" . Inflector::humanize(Inflector::underscore($alias)) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'add')); ?>
  • \n"; + $done[] = $details['controller']; + } + echo "\t\t\t
\n"; + } + } + ?> +
+
+
+ +
+ +
+
+

";?>

+
+
\n";?> + $details) { + if ($field === $details['foreignKey']) { + $isKey = true; + echo "\t\t>\n"; + echo "\t\t>\n\t\t\tHtml->link(\${$singularVar}['{$alias}']['{$details['displayField']}'], array('controller' => '{$details['controller']}', 'action' => 'view', \${$singularVar}['{$alias}']['{$details['primaryKey']}'])); ?>\n\t\t\t \n\t\t\n"; + break; + } + } + } + if ($isKey !== true) { + echo "\t\t>\n"; + echo "\t\t>\n\t\t\t\n\t\t\t \n\t\t\n"; + } + } + ?> +
+
+
+
+ + +
+

+ "; ?> +

+ +
+ + +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/empty b/code/ryzom/tools/server/www/webtt/app/vendors/shells/templates/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/elements/admin_left_menu.ctp b/code/ryzom/tools/server/www/webtt/app/views/elements/admin_left_menu.ctp new file mode 100644 index 000000000..8cfaa41c4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/elements/admin_left_menu.ctp @@ -0,0 +1,28 @@ +

+ Admin Menu +

+
+ +
diff --git a/code/ryzom/tools/server/www/webtt/app/views/elements/email/html/empty b/code/ryzom/tools/server/www/webtt/app/views/elements/email/html/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/elements/email/text/empty b/code/ryzom/tools/server/www/webtt/app/views/elements/email/text/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/elements/empty b/code/ryzom/tools/server/www/webtt/app/views/elements/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/elements/main_menu.ctp b/code/ryzom/tools/server/www/webtt/app/views/elements/main_menu.ctp new file mode 100644 index 000000000..7d6a70f97 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/elements/main_menu.ctp @@ -0,0 +1,22 @@ + diff --git a/code/ryzom/tools/server/www/webtt/app/views/errors/empty b/code/ryzom/tools/server/www/webtt/app/views/errors/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/add.ctp new file mode 100644 index 000000000..7a7d0c0be --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/add.ctp @@ -0,0 +1,46 @@ +
+ +
+ +
+

+ +
+ Form->create('FileIdentifier');?> +
+ + Form->input('imported_translation_file_id'); + echo $this->Form->input('command'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier_id'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_add.ctp new file mode 100644 index 000000000..0073afd78 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_add.ctp @@ -0,0 +1,46 @@ +
+ +
+ +
+

+ +
+ Form->create('FileIdentifier');?> +
+ + Form->input('imported_translation_file_id'); + echo $this->Form->input('command'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier_id'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_edit.ctp new file mode 100644 index 000000000..2d69ae33f --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_edit.ctp @@ -0,0 +1,47 @@ +
+ +
+ +
+

+ +
+ Form->create('FileIdentifier');?> +
+ Form->value('FileIdentifier.id')); ?> + Form->input('id'); + echo $this->Form->input('imported_translation_file_id'); + echo $this->Form->input('command'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier_id'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_index.ctp new file mode 100644 index 000000000..9220d8a55 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_index.ctp @@ -0,0 +1,70 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('imported_translation_file_id'),$paginator->sort('command'),$paginator->sort('translation_index'),$paginator->sort('identifier_id'),$paginator->sort('arguments'),$paginator->sort('reference_string'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($fileIdentifier['ImportedTranslationFile']['filename'], array('controller' => 'imported_translation_files', 'action' => 'view', $fileIdentifier['ImportedTranslationFile']['id'])); ?> + + Html->link($fileIdentifier['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $fileIdentifier['Identifier']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $fileIdentifier['FileIdentifier']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_view.ctp new file mode 100644 index 000000000..6c945cae1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/admin_view.ctp @@ -0,0 +1,101 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($fileIdentifier['ImportedTranslationFile']['filename'], array('controller' => 'imported_translation_files', 'action' => 'view', $fileIdentifier['ImportedTranslationFile']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+ Html->link($fileIdentifier['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $fileIdentifier['Identifier']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ + +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/edit.ctp new file mode 100644 index 000000000..326ee782a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/edit.ctp @@ -0,0 +1,47 @@ +
+ +
+ +
+

+ +
+ Form->create('FileIdentifier');?> +
+ Form->value('FileIdentifier.id')); ?> + Form->input('id'); + echo $this->Form->input('imported_translation_file_id'); + echo $this->Form->input('command'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier_id'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/index.ctp new file mode 100644 index 000000000..9220d8a55 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/index.ctp @@ -0,0 +1,70 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('imported_translation_file_id'),$paginator->sort('command'),$paginator->sort('translation_index'),$paginator->sort('identifier_id'),$paginator->sort('arguments'),$paginator->sort('reference_string'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($fileIdentifier['ImportedTranslationFile']['filename'], array('controller' => 'imported_translation_files', 'action' => 'view', $fileIdentifier['ImportedTranslationFile']['id'])); ?> + + Html->link($fileIdentifier['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $fileIdentifier['Identifier']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $fileIdentifier['FileIdentifier']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/view.ctp new file mode 100644 index 000000000..6c945cae1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/file_identifiers/view.ctp @@ -0,0 +1,101 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($fileIdentifier['ImportedTranslationFile']['filename'], array('controller' => 'imported_translation_files', 'action' => 'view', $fileIdentifier['ImportedTranslationFile']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+ Html->link($fileIdentifier['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $fileIdentifier['Identifier']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ + +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/helpers/empty b/code/ryzom/tools/server/www/webtt/app/views/helpers/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/add.ctp new file mode 100644 index 000000000..f45fb34b8 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/add.ctp @@ -0,0 +1,52 @@ +
+ +
+ +
+

+ +
+ Form->create('Identifier');?> +
+ + Form->input('language_id'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + echo $this->Form->input('translated'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_add.ctp new file mode 100644 index 000000000..12fd5bdab --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_add.ctp @@ -0,0 +1,69 @@ +
+ +
+ +
+

+ +
+ Form->create('Identifier');?> +
+ + Form->input('language_id'); + echo $this->Form->input('translation_file_id'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + echo $this->Form->input('translated'); + ?> +
+
+Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_edit.ctp new file mode 100644 index 000000000..78c2e80f4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_edit.ctp @@ -0,0 +1,70 @@ +
+ +
+ +
+

+ +
+ Form->create('Identifier');?> +
+ Form->value('Identifier.id')); ?> + Form->input('id'); + echo $this->Form->input('language_id'); + echo $this->Form->input('translation_file_id'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + echo $this->Form->input('translated'); + ?> +
+
+Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_index.ctp new file mode 100644 index 000000000..187df0bd3 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_index.ctp @@ -0,0 +1,88 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('language_id'),$paginator->sort('translation_file_id'),$paginator->sort('translation_index'),$paginator->sort('identifier'),$paginator->sort('arguments'),$paginator->sort('reference_string'),$paginator->sort('translated'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $identifier['Identifier']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_view.ctp new file mode 100644 index 000000000..e4335a348 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/admin_view.ctp @@ -0,0 +1,394 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
+
+ Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?> +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
">
+
"> + +
+ +
+ +
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/edit.ctp new file mode 100644 index 000000000..291860a41 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/edit.ctp @@ -0,0 +1,53 @@ +
+ +
+ +
+

+ +
+ Form->create('Identifier');?> +
+ Form->value('Identifier.id')); ?> + Form->input('id'); + echo $this->Form->input('language_id'); + echo $this->Form->input('translation_index'); + echo $this->Form->input('identifier'); + echo $this->Form->input('arguments'); + echo $this->Form->input('reference_string'); + echo $this->Form->input('translated'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/index.ctp new file mode 100644 index 000000000..5687d8579 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/index.ctp @@ -0,0 +1,68 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('translation_file_id'),$paginator->sort('identifier'),$paginator->sort('arguments'),$paginator->sort('reference_string'),$paginator->sort('translated'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?> + + Html->link(__('View details and comments', true), array('action' => 'view', $identifier['Identifier']['id'])); ?> + | Html->link(__('Add Comment', true), array('controller' => 'comments', 'action' => 'add', 'identifier_id' => $identifier['Identifier']['id'])); ?> + | Html->link(__('Add Translation', true), array('controller' => 'translations', 'action' => 'add', 'identifier_id' => $identifier['Identifier']['id'])); ?> + | Html->link(__('List Translations', true), array('controller' => 'translations', 'action' => 'index', 'identifier_id' => $identifier['Identifier']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/identifiers/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/identifiers/view.ctp new file mode 100644 index 000000000..b6790e74d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/identifiers/view.ctp @@ -0,0 +1,207 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($identifier['TranslationFile']['filename_template'], array('controller' => 'translation_files', 'action' => 'view', $identifier['TranslationFile']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_add.ctp new file mode 100644 index 000000000..af3952f73 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_add.ctp @@ -0,0 +1,50 @@ +
+ +
+ +
+

+ +
+ Form->create('ImportedTranslationFile');?> +
+ + Form->input('language_id'); + echo $this->Form->input('filename'); + echo $this->Form->input('merged'); + echo $this->Form->input('file_last_modified_date'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_edit.ctp new file mode 100644 index 000000000..d18d4fbac --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_edit.ctp @@ -0,0 +1,51 @@ +
+ +
+ +
+

+ +
+ Form->create('ImportedTranslationFile');?> +
+ Form->value('ImportedTranslationFile.id')); ?> + Form->input('id'); + echo $this->Form->input('language_id'); + echo $this->Form->input('filename'); + echo $this->Form->input('merged'); + echo $this->Form->input('file_last_modified_date'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_index.ctp new file mode 100644 index 000000000..e0278b9cf --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_index.ctp @@ -0,0 +1,73 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('language_id'),$paginator->sort('filename'),$paginator->sort('merged'),$paginator->sort('file_last_modified_date'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($importedTranslationFile['Language']['name'], array('controller' => 'languages', 'action' => 'view', $importedTranslationFile['Language']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $importedTranslationFile['ImportedTranslationFile']['id'])); ?> + Html->link(__('Delete', true), array('action' => 'delete', $importedTranslationFile['ImportedTranslationFile']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $importedTranslationFile['ImportedTranslationFile']['id'])); ?> + Html->link(__('Export', true), array('controller' => 'raw_files', 'action' => 'export', $importedTranslationFile['ImportedTranslationFile']['filename']), null, sprintf(__('Are you sure you want to export "%s"?', true), $importedTranslationFile['ImportedTranslationFile']['filename'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_view.ctp new file mode 100644 index 000000000..ce984a1f1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/admin_view.ctp @@ -0,0 +1,148 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($importedTranslationFile['Language']['name'], array('controller' => 'languages', 'action' => 'view', $importedTranslationFile['Language']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/index.ctp new file mode 100644 index 000000000..57f041dfc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/index.ctp @@ -0,0 +1,70 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('language_id'),$paginator->sort('filename'),$paginator->sort('merged'),$paginator->sort('file_last_modified_date'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($importedTranslationFile['Language']['name'], array('controller' => 'languages', 'action' => 'view', $importedTranslationFile['Language']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $importedTranslationFile['ImportedTranslationFile']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/view.ctp new file mode 100644 index 000000000..ee711e443 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/imported_translation_files/view.ctp @@ -0,0 +1,172 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($importedTranslationFile['Language']['name'], array('controller' => 'languages', 'action' => 'view', $importedTranslationFile['Language']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/add.ctp new file mode 100644 index 000000000..23eed9eb2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/add.ctp @@ -0,0 +1,22 @@ +
+Form->create('Language');?> +
+ + Form->input('name'); + echo $this->Form->input('code'); + ?> +
+Form->end(__('Submit', true));?> +
+
+

+
    + +
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_add.ctp new file mode 100644 index 000000000..d4e5e1034 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_add.ctp @@ -0,0 +1,22 @@ +
+Form->create('Language');?> +
+ + Form->input('name'); + echo $this->Form->input('code'); + ?> +
+Form->end(__('Submit', true));?> +
+
+

+
    + +
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_edit.ctp new file mode 100644 index 000000000..f68d48baa --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_edit.ctp @@ -0,0 +1,24 @@ +
+Form->create('Language');?> +
+ + Form->input('id'); + echo $this->Form->input('name'); + echo $this->Form->input('code'); + ?> +
+Form->end(__('Submit', true));?> +
+
+

+
    + +
  • Html->link(__('Delete', true), array('action' => 'delete', $this->Form->value('Language.id')), null, sprintf(__('Are you sure you want to delete # %s?', true), $this->Form->value('Language.id'))); ?>
  • +
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_index.ctp new file mode 100644 index 000000000..e18bb771c --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_index.ctp @@ -0,0 +1,57 @@ +
+

+ + + + + + + + + + + > + + + + + + + + +
Paginator->sort('id');?>Paginator->sort('name');?>Paginator->sort('code');?>Paginator->sort('created');?>Paginator->sort('modified');?>
      + Html->link(__('View', true), array('action' => 'view', $language['Language']['id'])); ?> + Html->link(__('Edit', true), array('action' => 'edit', $language['Language']['id'])); ?> + Html->link(__('Delete', true), array('action' => 'delete', $language['Language']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $language['Language']['id'])); ?> +
+

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> + | + Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?> +
+
+
+

+
    +
  • Html->link(__('New Language', true), array('action' => 'add')); ?>
  • +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_view.ctp new file mode 100644 index 000000000..aa7f2c923 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/admin_view.ctp @@ -0,0 +1,133 @@ +
+

+
+ > + > + +   + + > + > + +   + + > + > + +   + + > + > + +   + + > + > + +   + +
+
+
+

+
    +
  • Html->link(__('Edit Language', true), array('action' => 'edit', $language['Language']['id'])); ?>
  • +
  • Html->link(__('Delete Language', true), array('action' => 'delete', $language['Language']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $language['Language']['id'])); ?>
  • +
  • Html->link(__('List Languages', true), array('action' => 'index')); ?>
  • +
  • Html->link(__('New Language', true), array('action' => 'add')); ?>
  • +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • +
+
+ + diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/edit.ctp new file mode 100644 index 000000000..5eab47bb4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/edit.ctp @@ -0,0 +1,24 @@ +
+Form->create('Language');?> +
+ + Form->input('id'); + echo $this->Form->input('name'); + echo $this->Form->input('code'); + ?> +
+Form->end(__('Submit', true));?> +
+
+

+
    + +
  • Html->link(__('Delete', true), array('action' => 'delete', $this->Form->value('Language.id')), null, sprintf(__('Are you sure you want to delete # %s?', true), $this->Form->value('Language.id'))); ?>
  • +
  • Html->link(__('List Languages', true), array('action' => 'index'));?>
  • +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Identifier', true), array('controller' => 'identifiers', 'action' => 'add')); ?>
  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Translation File', true), array('controller' => 'translation_files', 'action' => 'add')); ?>
  • +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/index.ctp new file mode 100644 index 000000000..64cdf3bb4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/index.ctp @@ -0,0 +1,53 @@ +
+

+ + + + + + + + + + + > + + + + + + + + +
Paginator->sort('id');?>Paginator->sort('name');?>Paginator->sort('code');?>Paginator->sort('created');?>Paginator->sort('modified');?>
      + Html->link(__('View', true), array('action' => 'view', $language['Language']['id'])); ?> +
+

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> + | + Paginator->next(__('next', true) . ' >>', array(), null, array('class' => 'disabled'));?> +
+
+
+

+
    +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +

  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages.bak/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/view.ctp new file mode 100644 index 000000000..8560bc864 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages.bak/view.ctp @@ -0,0 +1,114 @@ +
+

+
+ > + > + +   + + > + > + +   + + > + > + +   + + > + > + +   + + > + > + +   + +
+
+
+

+
    +
  • Html->link(__('List Languages', true), array('action' => 'index')); ?>
  • +

  • +
  • Html->link(__('List Identifiers', true), array('controller' => 'identifiers', 'action' => 'index')); ?>
  • +

  • +
  • Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index')); ?>
  • +
+
+ + diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/add.ctp new file mode 100644 index 000000000..34124ee82 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/add.ctp @@ -0,0 +1,42 @@ +
+ +
+ +
+

+ +
+ Form->create('Language');?> +
+ + Form->input('name'); + echo $this->Form->input('code'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_add.ctp new file mode 100644 index 000000000..ab56f03bb --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_add.ctp @@ -0,0 +1,48 @@ +
+ +
+ +
+

+ +
+ Form->create('Language');?> +
+ + Form->input('name'); + echo $this->Form->input('code'); + ?> +
+
+Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_edit.ctp new file mode 100644 index 000000000..cddd8d03d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_edit.ctp @@ -0,0 +1,49 @@ +
+ +
+ +
+

+ +
+ Form->create('Language');?> +
+ Form->value('Language.id')); ?> + Form->input('id'); + echo $this->Form->input('name'); + echo $this->Form->input('code'); + ?> +
+
+Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_index.ctp new file mode 100644 index 000000000..c0ceca123 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_index.ctp @@ -0,0 +1,71 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('code'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link(__('View', true), array('action' => 'view', $language['Language']['id'])); ?> + Html->link(__('Edit', true), array('action' => 'edit', $language['Language']['id'])); ?> + Html->link(__('Delete', true), array('action' => 'delete', $language['Language']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $language['Language']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_view.ctp new file mode 100644 index 000000000..075d015e1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/admin_view.ctp @@ -0,0 +1,235 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/edit.ctp new file mode 100644 index 000000000..b38b855cc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/edit.ctp @@ -0,0 +1,43 @@ +
+ +
+ +
+

+ +
+ Form->create('Language');?> +
+ Form->value('Language.id')); ?> + Form->input('id'); + echo $this->Form->input('name'); + echo $this->Form->input('code'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/index.ctp new file mode 100644 index 000000000..153283b66 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/index.ctp @@ -0,0 +1,59 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('code'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link(__('View', true), array('action' => 'view', $language['Language']['id'])); ?> + | Html->link(__('List Translation Files', true), array('controller' => 'translation_files', 'action' => 'index', 'language_id' => $language['Language']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/languages/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/languages/view.ctp new file mode 100644 index 000000000..e3530ff09 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/languages/view.ctp @@ -0,0 +1,123 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/admin.ctp b/code/ryzom/tools/server/www/webtt/app/views/layouts/admin.ctp new file mode 100644 index 000000000..68fba719a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/layouts/admin.ctp @@ -0,0 +1,41 @@ + + + + Html->charset(); ?> + + <?php __('Administration'); ?> - + <?php echo $title_for_layout; ?> + + Html->meta('icon'); + //echo $this->Html->css('cake.generic'); + echo $this->Html->css(array('reset', 'text', 'grid', 'layout', 'nav')); + echo ''; + echo ''; + echo $this->Html->script(array('jquery-1.3.2.min.js', 'jquery-ui.js', 'jquery-fluid16.js')); + echo $scripts_for_layout; + ?> + + +
+
+

+ Administration +

+
+
+
+ element('admin/main_menu'); ?> +
+ +
+ + Session->flash(); ?> + + + +
+
+ element('sql_dump'); ?> + + diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp b/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp new file mode 100644 index 000000000..083a2a64c --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp @@ -0,0 +1,59 @@ + + + + + Html->charset(); ?> + + <?php __('Ryzom Core: Web Translation Tool :: '); ?> + <?php echo $title_for_layout; ?> + + Html->meta('icon'); + + echo $this->Html->css('cake.generic'); + + echo $scripts_for_layout; + ?> + + +
+ +
+ + Session->flash(); ?> + + + +
+ +
+ element('sql_dump'); ?> + + \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp.bak b/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp.bak new file mode 100644 index 000000000..ee4c977be --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/layouts/default.ctp.bak @@ -0,0 +1,59 @@ + + + + + Html->charset(); ?> + + <?php __('Ryzom Core: Web Translation Tool :: '); ?> + <?php echo $title_for_layout; ?> + + Html->meta('icon'); + + echo $this->Html->css('cake.generic'); + + echo $scripts_for_layout; + ?> + + +
+ +
+ + Session->flash(); ?> + + + +
+ +
+ element('sql_dump'); ?> + + \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/default_debug.ctp b/code/ryzom/tools/server/www/webtt/app/views/layouts/default_debug.ctp new file mode 100644 index 000000000..5e06ca479 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/layouts/default_debug.ctp @@ -0,0 +1,59 @@ + + + + + Html->charset(); ?> + + <?php __('Ryzom Core: Web Translation Tool :: '); ?> + <?php echo $title_for_layout; ?> + + Html->meta('icon'); + + echo $this->Html->css('cake.generic'); + + echo $scripts_for_layout; + ?> + + +
+ +
+ + Session->flash(); ?> + + + +
+ +
+ element('sql_dump'); ?> + + \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/email/html/empty b/code/ryzom/tools/server/www/webtt/app/views/layouts/email/html/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/email/text/empty b/code/ryzom/tools/server/www/webtt/app/views/layouts/email/text/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/js/empty b/code/ryzom/tools/server/www/webtt/app/views/layouts/js/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/new.ctp b/code/ryzom/tools/server/www/webtt/app/views/layouts/new.ctp new file mode 100644 index 000000000..761e4d8c8 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/layouts/new.ctp @@ -0,0 +1,94 @@ + + + + Html->charset(); ?> + + <?php __('Ryzom Core: Web Translation Tool :: '); ?> + <?php echo $title_for_layout; ?> + + Html->meta('icon'); + //echo $this->Html->css('cake.generic'); + echo $this->Html->css(array('reset', 'text', 'grid', 'layout', 'nav', 'labelWidth')); + echo ''; + echo ''; + echo $this->Html->script(array('jquery-1.3.2.min.js', 'jquery-ui.js', 'jquery-fluid16.js')); + echo $scripts_for_layout; + ?> + + + +
+ params['prefix']) && $this->params['prefix'] == "admin") { + ?> +
+
+
+
+ Html->link(__('Back to admin page', true), array('controller' => 'pages', 'action' => 'display', 'prefix' => 'admin', 'home')); ?> +
+
+
+
+
+
+ + +
+
+
+
/ + Html->link(__(Inflector::pluralize($model), true), array('controller' => $controller, 'action' => 'index')); + if ($path) + echo " / "; + } + ?> +
+
+
+
+
+
+ +
+ + +
+ + Session->flash(); ?> + Session->flash('auth'); ?> + + + +
+ +
+
+ element('sql_dump'); ?> + + diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/rss/empty b/code/ryzom/tools/server/www/webtt/app/views/layouts/rss/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/layouts/xml/empty b/code/ryzom/tools/server/www/webtt/app/views/layouts/xml/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/pages/empty b/code/ryzom/tools/server/www/webtt/app/views/pages/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/pages/home.ctp b/code/ryzom/tools/server/www/webtt/app/views/pages/home.ctp new file mode 100644 index 000000000..fb895390b --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/pages/home.ctp @@ -0,0 +1,25 @@ + +
+

+

+ Html->link(__('List Languages', true), array('controller' => 'languages', 'action' => 'index')); ?> +

+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/raw_files/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/raw_files/admin_index.ctp new file mode 120000 index 000000000..f5532221a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/raw_files/admin_index.ctp @@ -0,0 +1 @@ +index.ctp \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/raw_files/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/raw_files/index.ctp new file mode 100644 index 000000000..885c9cfdf --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/raw_files/index.ctp @@ -0,0 +1,64 @@ +
+ +
+ +
+

+ + tableHeaders(array($paginator->sort('filename'),$paginator->sort('size'),$paginator->sort('modified'),__('Actions', true),)); +echo ''.$tableHeaders.''; ?> + + + > + + + + + + +'.$tableHeaders.''; ?>
Time->nice($rawFile['RawFile']['modified']); ?> + Html->link(__('View', true), array('action' => 'view', $rawFile['RawFile']['filename'])); ?> + Html->link(__('Import', true), array('action' => 'import', $rawFile['RawFile']['filename'])); ?> + + + +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> + | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
+element('sql_dump');?> \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/raw_files/listdir.ctp b/code/ryzom/tools/server/www/webtt/app/views/raw_files/listdir.ctp new file mode 120000 index 000000000..f5532221a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/raw_files/listdir.ctp @@ -0,0 +1 @@ +index.ctp \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/raw_files/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/raw_files/view.ctp new file mode 100644 index 000000000..ee5e7e265 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/raw_files/view.ctp @@ -0,0 +1,43 @@ +
+

+
+ > + > + +   + + > + > + Html->link($vote['Translation']['translation_text'], array('controller' => 'translations', 'action' => 'view', $vote['Translation']['id'])); ?> +   + + > + > + Html->link($vote['User']['name'], array('controller' => 'users', 'action' => 'view', $vote['User']['id'])); ?> +   + + > + > + +   + + > + > + +   + +
+
+
+

+
    +
  • Html->link(__('Edit Vote', true), array('action' => 'edit', $vote['Vote']['id'])); ?>
  • +
  • Html->link(__('Delete Vote', true), array('action' => 'delete', $vote['Vote']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $vote['Vote']['id'])); ?>
  • +
  • Html->link(__('List Votes', true), array('action' => 'index')); ?>
  • +
  • Html->link(__('New Vote', true), array('action' => 'add')); ?>
  • +
  • Html->link(__('List Translations', true), array('controller' => 'translations', 'action' => 'index')); ?>
  • +
  • Html->link(__('New Translation', true), array('controller' => 'translations', 'action' => 'add')); ?>
  • +
  • Html->link(__('List Users', true), array('controller' => 'users', 'action' => 'index')); ?>
  • +
  • Html->link(__('New User', true), array('controller' => 'users', 'action' => 'add')); ?>
  • +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/scaffolds/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/scaffolds/edit.ctp new file mode 100644 index 000000000..34b570631 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/scaffolds/edit.ctp @@ -0,0 +1,47 @@ + +
+Form->create(); + echo $this->Form->inputs($scaffoldFields, array('created', 'modified', 'updated')); + echo $this->Form->end(__('Submit', true)); +?> +
+
+

+
    +action != 'add'):?> +
  • Html->link(__('Delete', true), array('action' => 'delete', $this->Form->value($modelClass.'.'.$primaryKey)), null, __('Are you sure you want to delete', true).' #' . $this->Form->value($modelClass.'.'.$primaryKey)); ?>
  • + +
  • Html->link(__('List', true).' '.$pluralHumanName, array('action' => 'index'));?>
  • + $_data) { + foreach ($_data as $_alias => $_details) { + if ($_details['controller'] != $this->name && !in_array($_details['controller'], $done)) { + echo "\t\t
  • " . $this->Html->link(sprintf(__('List %s', true), Inflector::humanize($_details['controller'])), array('controller' => $_details['controller'], 'action' =>'index')) . "
  • \n"; + echo "\t\t
  • " . $this->Html->link(sprintf(__('New %s', true), Inflector::humanize(Inflector::underscore($_alias))), array('controller' => $_details['controller'], 'action' =>'add')) . "
  • \n"; + $done[] = $_details['controller']; + } + } + } +?> +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/scaffolds/empty b/code/ryzom/tools/server/www/webtt/app/views/scaffolds/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/views/scaffolds/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/scaffolds/index.ctp new file mode 100644 index 000000000..ce4a09a3d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/scaffolds/index.ctp @@ -0,0 +1,93 @@ + +
+

+ + + + + + + +\n"; + foreach ($scaffoldFields as $_field) { + $isKey = false; + if (!empty($associations['belongsTo'])) { + foreach ($associations['belongsTo'] as $_alias => $_details) { + if ($_field === $_details['foreignKey']) { + $isKey = true; + echo "\t\t\n"; + break; + } + } + } + if ($isKey !== true) { + echo "\t\t\n"; + } + } + + echo "\t\t\n"; + echo "\t\n"; + +endforeach; +echo "\n"; +?> +
Paginator->sort($_field);?>
\n\t\t\t" . $this->Html->link(${$singularVar}[$_alias][$_details['displayField']], array('controller' => $_details['controller'], 'action' => 'view', ${$singularVar}[$_alias][$_details['primaryKey']])) . "\n\t\t\n\t\t\t" . ${$singularVar}[$modelClass][$_field] . " \n\t\t\n"; + echo "\t\t\t" . $this->Html->link(__('View', true), array('action' => 'view', ${$singularVar}[$modelClass][$primaryKey])) . "\n"; + echo "\t\t\t" . $this->Html->link(__('Edit', true), array('action' => 'edit', ${$singularVar}[$modelClass][$primaryKey])) . "\n"; + echo "\t\t\t" . $this->Html->link(__('Delete', true), array('action' => 'delete', ${$singularVar}[$modelClass][$primaryKey]), null, __('Are you sure you want to delete', true).' #' . ${$singularVar}[$modelClass][$primaryKey]) . "\n"; + echo "\t\t
+

Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+
+ Paginator->prev('<< ' . __('previous', true), array(), null, array('class' => 'disabled')) . "\n";?> + | Paginator->numbers() . "\n"?> + Paginator->next(__('next', true) .' >>', array(), null, array('class' => 'disabled')) . "\n";?> +
+
+
+

+
    +
  • Html->link(sprintf(__('New %s', true), $singularHumanName), array('action' => 'add')); ?>
  • + $_data) { + foreach ($_data as $_alias => $_details) { + if ($_details['controller'] != $this->name && !in_array($_details['controller'], $done)) { + echo "\t\t
  • " . $this->Html->link(sprintf(__('List %s', true), Inflector::humanize($_details['controller'])), array('controller' => $_details['controller'], 'action' => 'index')) . "
  • \n"; + echo "\t\t
  • " . $this->Html->link(sprintf(__('New %s', true), Inflector::humanize(Inflector::underscore($_alias))), array('controller' => $_details['controller'], 'action' => 'add')) . "
  • \n"; + $done[] = $_details['controller']; + } + } + } +?> +
+
\ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/scaffolds/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/scaffolds/view.ctp new file mode 100644 index 000000000..ae898d1fa --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/scaffolds/view.ctp @@ -0,0 +1,161 @@ + +
+

+
+ $_details) { + if ($_field === $_details['foreignKey']) { + $isKey = true; + echo "\t\t" . Inflector::humanize($_alias) . "\n"; + echo "\t\t\n\t\t\t" . $this->Html->link(${$singularVar}[$_alias][$_details['displayField']], array('controller' => $_details['controller'], 'action' => 'view', ${$singularVar}[$_alias][$_details['primaryKey']])) . "\n\t\t \n"; + break; + } + } + } + if ($isKey !== true) { + echo "\t\t" . Inflector::humanize($_field) . "\n"; + echo "\t\t\n\t\t\t{${$singularVar}[$modelClass][$_field]}\n \t\t\n"; + } +} +?> +
+
+
+

+
    +" .$this->Html->link(sprintf(__('Edit %s', true), $singularHumanName), array('action' => 'edit', ${$singularVar}[$modelClass][$primaryKey])). " \n"; + echo "\t\t
  • " .$this->Html->link(sprintf(__('Delete %s', true), $singularHumanName), array('action' => 'delete', ${$singularVar}[$modelClass][$primaryKey]), null, __('Are you sure you want to delete', true).' #' . ${$singularVar}[$modelClass][$primaryKey] . '?'). "
  • \n"; + echo "\t\t
  • " .$this->Html->link(sprintf(__('List %s', true), $pluralHumanName), array('action' => 'index')). "
  • \n"; + echo "\t\t
  • " .$this->Html->link(sprintf(__('New %s', true), $singularHumanName), array('action' => 'add')). "
  • \n"; + + $done = array(); + foreach ($associations as $_type => $_data) { + foreach ($_data as $_alias => $_details) { + if ($_details['controller'] != $this->name && !in_array($_details['controller'], $done)) { + echo "\t\t
  • " . $this->Html->link(sprintf(__('List %s', true), Inflector::humanize($_details['controller'])), array('controller' => $_details['controller'], 'action' => 'index')) . "
  • \n"; + echo "\t\t
  • " . $this->Html->link(sprintf(__('New %s', true), Inflector::humanize(Inflector::underscore($_alias))), array('controller' => $_details['controller'], 'action' => 'add')) . "
  • \n"; + $done[] = $_details['controller']; + } + } + } +?> +
+
+ $_details): ?> + + $_details): +$otherSingularVar = Inflector::variable($_alias); +?> + + \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/add.ctp new file mode 100644 index 000000000..d42bdec3c --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/add.ctp @@ -0,0 +1,129 @@ +
+ +
+ + + +
+ + +

+ +
+ Form->create('Translation');?> +
+ + Form->hidden('identifier_id', array('default' => $identifier['Identifier']['id'])); + echo $this->Form->input('translation_text'); + // TODO: change user_id for authorized user + echo $this->Form->hidden('user_id', array('default' => 1)); + ?> +
+
+ Form->end(__('Submit', true));?> +
+
+
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($identifier['Language']['name'], array('controller' => 'languages', 'action' => 'view', $identifier['Language']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_add.ctp new file mode 100644 index 000000000..199001ba6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_add.ctp @@ -0,0 +1,50 @@ +
+ +
+ +
+

+ +
+ Form->create('Translation');?> +
+ + Form->input('identifier_id'); + echo $this->Form->input('translation_text'); + echo $this->Form->input('user_id'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_edit.ctp new file mode 100644 index 000000000..baf23f0a6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_edit.ctp @@ -0,0 +1,51 @@ +
+ +
+ +
+

+ +
+ Form->create('Translation');?> +
+ Form->value('Translation.id')); ?> + Form->input('id'); + echo $this->Form->input('identifier_id'); + echo $this->Form->input('translation_text'); + echo $this->Form->input('user_id'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_index.ctp new file mode 100644 index 000000000..b878f7bda --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_index.ctp @@ -0,0 +1,76 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('identifier_id'),$paginator->sort('translation_text'),$paginator->sort('user_id'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($translation['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $translation['Identifier']['id'])); ?> + + Html->link($translation['User']['name'], array('controller' => 'users', 'action' => 'view', $translation['User']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $translation['Translation']['id'])); ?> + Html->link(__('Edit', true), array('action' => 'edit', $translation['Translation']['id'])); ?> + Html->link(__('Delete', true), array('action' => 'delete', $translation['Translation']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $translation['Translation']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_view.ctp new file mode 100644 index 000000000..6b852a9dc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/admin_view.ctp @@ -0,0 +1,142 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($translation['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $translation['Identifier']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
+
+ Html->link($translation['User']['name'], array('controller' => 'users', 'action' => 'view', $translation['User']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/edit.ctp new file mode 100644 index 000000000..0484d295e --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/edit.ctp @@ -0,0 +1,121 @@ +
+ +
+ + +
+

+ +
+ Form->create('Translation');?> +
+ Form->value('Translation.id')); ?> + Form->input('id'); + echo $this->Form->input('identifier_id', array('type' => 'text', 'name'=>'buzu', 'value'=>$identifiers[$this->Form->value('Translation.identifier_id')], 'readonly' => 'readonly')); + echo $this->Form->hidden('identifier_id', array('default' => $this->Form->value('Translation.identifier_id'))); + echo $this->Form->input('translation_text'); + // TODO: change user_id for authorized user + echo $this->Form->hidden('user_id', array('default' => 1)); + ?> +
+
+ Form->end(__('Submit', true));?> +
+
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($identifier['Language']['name'], array('controller' => 'languages', 'action' => 'view', $identifier['Language']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/index.ctp new file mode 100644 index 000000000..7e44b94d2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/index.ctp @@ -0,0 +1,76 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('identifier_id'),$paginator->sort('translation_text'),$paginator->sort('user_id'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($translation['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $translation['Identifier']['id'])); ?> + + Html->link($translation['User']['name'], array('controller' => 'users', 'action' => 'view', $translation['User']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $translation['Translation']['id'])); ?> + Html->link(__('Edit', true), array('action' => 'edit', $translation['Translation']['id'])); ?> + Html->link(__('Delete', true), array('action' => 'delete', $translation['Translation']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $translation['Translation']['id'])); ?> + | Html->link(__('Vote', true), array('controller' => 'votes', 'action' => 'vote', 'translation' => $translation['Translation']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/translations/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/translations/view.ctp new file mode 100644 index 000000000..a1b87c329 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/translations/view.ctp @@ -0,0 +1,206 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + +
+ +
+
+
+ Html->link($translation['Identifier']['identifier'], array('controller' => 'identifiers', 'action' => 'view', $translation['Identifier']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
+
+ Html->link($translation['User']['name'], array('controller' => 'users', 'action' => 'view', $translation['User']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($identifier['Language']['name'], array('controller' => 'languages', 'action' => 'view', $identifier['Language']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ + +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/add.ctp new file mode 100644 index 000000000..4bd0cc224 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/add.ctp @@ -0,0 +1,43 @@ +
+ +
+ +
+

+ +
+ Form->create('User');?> +
+ + Form->input('name'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_add.ctp new file mode 100644 index 000000000..8a3121e33 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_add.ctp @@ -0,0 +1,43 @@ +
+ +
+ +
+

+ +
+ Form->create('User');?> +
+ + Form->input('name'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_edit.ctp new file mode 100644 index 000000000..ec9671ca6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_edit.ctp @@ -0,0 +1,44 @@ +
+ +
+ +
+

+ +
+ Form->create('User');?> +
+ Form->value('User.id')); ?> + Form->input('id'); + echo $this->Form->input('name'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_index.ctp new file mode 100644 index 000000000..43d7d4739 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_index.ctp @@ -0,0 +1,66 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link(__('View', true), array('action' => 'view', $user['User']['id'])); ?> + Html->link(__('Edit', true), array('action' => 'edit', $user['User']['id'])); ?> + Html->link(__('Delete', true), array('action' => 'delete', $user['User']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $user['User']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/admin_view.ctp new file mode 100644 index 000000000..dd554f14a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/admin_view.ctp @@ -0,0 +1,171 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/edit.ctp new file mode 100644 index 000000000..acdec0d93 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/edit.ctp @@ -0,0 +1,44 @@ +
+ +
+ +
+

+ +
+ Form->create('User');?> +
+ Form->value('User.id')); ?> + Form->input('id'); + echo $this->Form->input('name'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/index.ctp new file mode 100644 index 000000000..d8cc5607e --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/index.ctp @@ -0,0 +1,63 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('name'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link(__('View', true), array('action' => 'view', $user['User']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/users/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/users/view.ctp new file mode 100644 index 000000000..827058785 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/users/view.ctp @@ -0,0 +1,167 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ +
+

+ +

+ +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/add.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/add.ctp new file mode 100644 index 000000000..2fab35c25 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/add.ctp @@ -0,0 +1,42 @@ +
+ +
+ +
+

+ +
+ Form->create('Vote');?> +
+ + Form->input('translation_id'); + echo $this->Form->input('user_id'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/admin_add.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_add.ctp new file mode 100644 index 000000000..879155f32 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_add.ctp @@ -0,0 +1,44 @@ +
+ +
+ +
+

+ +
+ Form->create('Vote');?> +
+ + Form->input('translation_id'); + echo $this->Form->input('user_id'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/admin_edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_edit.ctp new file mode 100644 index 000000000..9b662d5bc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_edit.ctp @@ -0,0 +1,45 @@ +
+ +
+ +
+

+ +
+ Form->create('Vote');?> +
+ Form->value('Vote.id')); ?> + Form->input('id'); + echo $this->Form->input('translation_id'); + echo $this->Form->input('user_id'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/admin_index.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_index.ctp new file mode 100644 index 000000000..2bbc1e9a1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_index.ctp @@ -0,0 +1,71 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('translation_id'),$paginator->sort('user_id'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($vote['Translation']['translation_text'], array('controller' => 'translations', 'action' => 'view', $vote['Translation']['id'])); ?> + + Html->link($vote['User']['name'], array('controller' => 'users', 'action' => 'view', $vote['User']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $vote['Vote']['id'])); ?> + Html->link(__('Edit', true), array('action' => 'edit', $vote['Vote']['id'])); ?> + Html->link(__('Delete', true), array('action' => 'delete', $vote['Vote']['id']), null, sprintf(__('Are you sure you want to delete # %s?', true), $vote['Vote']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/admin_view.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_view.ctp new file mode 100644 index 000000000..fdc48cebd --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/admin_view.ctp @@ -0,0 +1,79 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($vote['Translation']['translation_text'], array('controller' => 'translations', 'action' => 'view', $vote['Translation']['id'])); ?> +
+ +
+
+
+ Html->link($vote['User']['name'], array('controller' => 'users', 'action' => 'view', $vote['User']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ + +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/edit.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/edit.ctp new file mode 100644 index 000000000..c77827257 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/edit.ctp @@ -0,0 +1,43 @@ +
+ +
+ +
+

+ +
+ Form->create('Vote');?> +
+ Form->value('Vote.id')); ?> + Form->input('id'); + echo $this->Form->input('translation_id'); + echo $this->Form->input('user_id'); + ?> +
+ Form->end(__('Submit', true));?> +
+ +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/index.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/index.ctp new file mode 100644 index 000000000..1a76ec74b --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/index.ctp @@ -0,0 +1,68 @@ +
+ +
+ +
+

+ tableHeaders(array($paginator->sort('id'),$paginator->sort('translation_id'),$paginator->sort('user_id'),$paginator->sort('created'),$paginator->sort('modified'),__('Actions', true),)); + echo ''.$tableHeaders.''; ?> + + + > + + + + + + + + + '.$tableHeaders.''; ?> +
+ Html->link($vote['Translation']['translation_text'], array('controller' => 'translations', 'action' => 'view', $vote['Translation']['id'])); ?> + + Html->link($vote['User']['name'], array('controller' => 'users', 'action' => 'view', $vote['User']['id'])); ?> + + Html->link(__('View', true), array('action' => 'view', $vote['Vote']['id'])); ?> + Html->link(__('Edit', true), array('action' => 'edit', $vote['Vote']['id'])); ?> +
+ + +

+ Paginator->counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) + )); + ?>

+ +
+ Paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> + | Paginator->numbers();?> | + Paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?> +
+
+
diff --git a/code/ryzom/tools/server/www/webtt/app/views/votes/view.ctp b/code/ryzom/tools/server/www/webtt/app/views/votes/view.ctp new file mode 100644 index 000000000..0373b8e16 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/views/votes/view.ctp @@ -0,0 +1,76 @@ +
+ +
+ +
+ +
+
+

+
+
+ +
">
+
"> + + +
+ +
+
+
+ Html->link($vote['Translation']['translation_text'], array('controller' => 'translations', 'action' => 'view', $vote['Translation']['id'])); ?> +
+ +
+
+
+ Html->link($vote['User']['name'], array('controller' => 'users', 'action' => 'view', $vote['User']['id'])); ?> +
+ +
+
">
+
"> + + +
+ +
+
">
+
"> + + +
+ +
+
+
+
+
+ + +
+
diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/.htaccess b/code/ryzom/tools/server/www/webtt/app/webroot/.htaccess new file mode 100644 index 000000000..f9d8b938b --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/.htaccess @@ -0,0 +1,6 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] + \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css.php b/code/ryzom/tools/server/www/webtt/app/webroot/css.php new file mode 100644 index 000000000..aae68cba8 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css.php @@ -0,0 +1,96 @@ +compress($data); + $ratio = 100 - (round(strlen($output) / strlen($data), 3) * 100); + $output = " /* file: $name, ratio: $ratio% */ " . $output; + return $output; + } +/** + * Write CSS cache + * + * @param unknown_type $path + * @param unknown_type $content + * @return unknown + */ + function write_css_cache($path, $content) { + if (!is_dir(dirname($path))) { + mkdir(dirname($path)); + } + $cache = new File($path); + return $cache->write($content); + } + + if (preg_match('|\.\.|', $url) || !preg_match('|^ccss/(.+)$|i', $url, $regs)) { + die('Wrong file name.'); + } + + $filename = 'css/' . $regs[1]; + $filepath = CSS . $regs[1]; + $cachepath = CACHE . 'css' . DS . str_replace(array('/','\\'), '-', $regs[1]); + + if (!file_exists($filepath)) { + die('Wrong file name.'); + } + + if (file_exists($cachepath)) { + $templateModified = filemtime($filepath); + $cacheModified = filemtime($cachepath); + + if ($templateModified > $cacheModified) { + $output = make_clean_css($filepath, $filename); + write_css_cache($cachepath, $output); + } else { + $output = file_get_contents($cachepath); + } + } else { + $output = make_clean_css($filepath, $filename); + write_css_cache($cachepath, $output); + $templateModified = time(); + } + + header("Date: " . date("D, j M Y G:i:s ", $templateModified) . 'GMT'); + header("Content-Type: text/css"); + header("Expires: " . gmdate("D, d M Y H:i:s", time() + DAY) . " GMT"); + header("Cache-Control: max-age=86400, must-revalidate"); // HTTP/1.1 + header("Pragma: cache"); // HTTP/1.0 + print $output; diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/960.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/960.css new file mode 100755 index 000000000..9e670fc02 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/960.css @@ -0,0 +1,493 @@ +/* + 960 Grid System ~ Core CSS. + Learn more ~ http://960.gs/ + + Licensed under GPL and MIT. + + WebTT template based on 960 Grid System (http://960.gs/) +*/ + +/* =Containers +--------------------------------------------------------------------------------*/ + +.container_12, +.container_16 +{ + margin-left: auto; + margin-right: auto; + width: 960px; +} + +/* =Grid >> Global +--------------------------------------------------------------------------------*/ + +.grid_1, +.grid_2, +.grid_3, +.grid_4, +.grid_5, +.grid_6, +.grid_7, +.grid_8, +.grid_9, +.grid_10, +.grid_11, +.grid_12, +.grid_13, +.grid_14, +.grid_15, +.grid_16 +{ + display: inline; + float: left; + margin-left: 10px; + margin-right: 10px; +} + +.container_12 .grid_3, +.container_16 .grid_4 +{ + width: 220px; +} + +.container_12 .grid_6, +.container_16 .grid_8 +{ + width: 460px; +} + +.container_12 .grid_9, +.container_16 .grid_12 +{ + width: 700px; +} + +.container_12 .grid_12, +.container_16 .grid_16 +{ + width: 940px; +} + +/* =Grid >> Children (Alpha ~ First, Omega ~ Last) +--------------------------------------------------------------------------------*/ + +.alpha +{ + margin-left: 0; +} + +.omega +{ + margin-right: 0; +} + +/* =Grid >> 12 Columns +--------------------------------------------------------------------------------*/ + +.container_12 .grid_1 +{ + width: 60px; +} + +.container_12 .grid_2 +{ + width: 140px; +} + +.container_12 .grid_4 +{ + width: 300px; +} + +.container_12 .grid_5 +{ + width: 380px; +} + +.container_12 .grid_7 +{ + width: 540px; +} + +.container_12 .grid_8 +{ + width: 620px; +} + +.container_12 .grid_10 +{ + width: 780px; +} + +.container_12 .grid_11 +{ + width: 860px; +} + +/* =Grid >> 16 Columns +--------------------------------------------------------------------------------*/ + +.container_16 .grid_1 +{ + width: 40px; +} + +.container_16 .grid_2 +{ + width: 100px; +} + +.container_16 .grid_3 +{ + width: 160px; +} + +.container_16 .grid_5 +{ + width: 280px; +} + +.container_16 .grid_6 +{ + width: 340px; +} + +.container_16 .grid_7 +{ + width: 400px; +} + +.container_16 .grid_9 +{ + width: 520px; +} + +.container_16 .grid_10 +{ + width: 580px; +} + +.container_16 .grid_11 +{ + width: 640px; +} + +.container_16 .grid_13 +{ + width: 760px; +} + +.container_16 .grid_14 +{ + width: 820px; +} + +.container_16 .grid_15 +{ + width: 880px; +} + +/* =Prefix Extra Space >> Global +--------------------------------------------------------------------------------*/ + +.container_12 .prefix_3, +.container_16 .prefix_4 +{ + padding-left: 240px; +} + +.container_12 .prefix_6, +.container_16 .prefix_8 +{ + padding-left: 480px; +} + +.container_12 .prefix_9, +.container_16 .prefix_12 +{ + padding-left: 720px; +} + +/* =Prefix Extra Space >> 12 Columns +--------------------------------------------------------------------------------*/ + +.container_12 .prefix_1 +{ + padding-left: 80px; +} + +.container_12 .prefix_2 +{ + padding-left: 160px; +} + +.container_12 .prefix_4 +{ + padding-left: 320px; +} + +.container_12 .prefix_5 +{ + padding-left: 400px; +} + +.container_12 .prefix_7 +{ + padding-left: 560px; +} + +.container_12 .prefix_8 +{ + padding-left: 640px; +} + +.container_12 .prefix_10 +{ + padding-left: 800px; +} + +.container_12 .prefix_11 +{ + padding-left: 880px; +} + +/* =Prefix Extra Space >> 16 Columns +--------------------------------------------------------------------------------*/ + +.container_16 .prefix_1 +{ + padding-left: 60px; +} + +.container_16 .prefix_2 +{ + padding-left: 120px; +} + +.container_16 .prefix_3 +{ + padding-left: 180px; +} + +.container_16 .prefix_5 +{ + padding-left: 300px; +} + +.container_16 .prefix_6 +{ + padding-left: 360px; +} + +.container_16 .prefix_7 +{ + padding-left: 420px; +} + +.container_16 .prefix_9 +{ + padding-left: 540px; +} + +.container_16 .prefix_10 +{ + padding-left: 600px; +} + +.container_16 .prefix_11 +{ + padding-left: 660px; +} + +.container_16 .prefix_13 +{ + padding-left: 780px; +} + +.container_16 .prefix_14 +{ + padding-left: 840px; +} + +.container_16 .prefix_15 +{ + padding-left: 900px; +} + +/* =Suffix Extra Space >> Global +--------------------------------------------------------------------------------*/ + +.container_12 .suffix_3, +.container_16 .suffix_4 +{ + padding-right: 240px; +} + +.container_12 .suffix_6, +.container_16 .suffix_8 +{ + padding-right: 480px; +} + +.container_12 .suffix_9, +.container_16 .suffix_12 +{ + padding-right: 720px; +} + +/* =Suffix Extra Space >> 12 Columns +--------------------------------------------------------------------------------*/ + +.container_12 .suffix_1 +{ + padding-right: 80px; +} + +.container_12 .suffix_2 +{ + padding-right: 160px; +} + +.container_12 .suffix_4 +{ + padding-right: 320px; +} + +.container_12 .suffix_5 +{ + padding-right: 400px; +} + +.container_12 .suffix_7 +{ + padding-right: 560px; +} + +.container_12 .suffix_8 +{ + padding-right: 640px; +} + +.container_12 .suffix_10 +{ + padding-right: 800px; +} + +.container_12 .suffix_11 +{ + padding-right: 880px; +} + +/* =Suffix Extra Space >> 16 Columns +--------------------------------------------------------------------------------*/ + +.container_16 .suffix_1 +{ + padding-right: 60px; +} + +.container_16 .suffix_2 +{ + padding-right: 120px; +} + +.container_16 .suffix_3 +{ + padding-right: 180px; +} + +.container_16 .suffix_5 +{ + padding-right: 300px; +} + +.container_16 .suffix_6 +{ + padding-right: 360px; +} + +.container_16 .suffix_7 +{ + padding-right: 420px; +} + +.container_16 .suffix_9 +{ + padding-right: 540px; +} + +.container_16 .suffix_10 +{ + padding-right: 600px; +} + +.container_16 .suffix_11 +{ + padding-right: 660px; +} + +.container_16 .suffix_13 +{ + padding-right: 780px; +} + +.container_16 .suffix_14 +{ + padding-right: 840px; +} + +.container_16 .suffix_15 +{ + padding-right: 900px; +} + +/* =Clear Floated Elements +--------------------------------------------------------------------------------*/ + +/* http://sonspring.com/journal/clearing-floats */ + +html body * span.clear, +html body * div.clear, +html body * li.clear, +html body * dd.clear +{ + background: none; + border: 0; + clear: both; + display: block; + float: none; + font-size: 0; + list-style: none; + margin: 0; + padding: 0; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; +} + +/* http://www.positioniseverything.net/easyclearing.html */ + +.clearfix:after +{ + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix +{ + display: inline-block; +} + +* html .clearfix +{ + height: 1%; +} + +.clearfix +{ + display: block; +} \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/cake.generic.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/cake.generic.css new file mode 100644 index 000000000..101deb26a --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/cake.generic.css @@ -0,0 +1,535 @@ +/** + * + * Generic CSS for CakePHP + * + * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) + * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * + * Licensed under The MIT License + * Redistributions of files must retain the above copyright notice. + * + * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * @link http://cakephp.org CakePHP(tm) Project + * @package cake + * @subpackage cake.app.webroot.css + * @since CakePHP(tm) + * @license MIT License (http://www.opensource.org/licenses/mit-license.php) + */ + +* { + margin:0; + padding:0; +} + +/** General Style Info **/ +body { + background: #003d4c; + color: #fff; + font-family:'lucida grande',verdana,helvetica,arial,sans-serif; + font-size:90%; + margin: 0; +} +a { + color: #003d4c; + text-decoration: underline; + font-weight: bold; +} +a:hover { + color: #367889; + text-decoration:none; +} +a img { + border:none; +} +h1, h2, h3, h4 { + font-weight: normal; + margin-bottom:0.5em; +} +h1 { + background:#fff; + color: #003d4c; + font-size: 100%; +} +h2 { + background:#fff; + color: #e32; + font-family:'Gill Sans','lucida grande', helvetica, arial, sans-serif; + font-size: 190%; +} +h3 { + color: #993; + font-family:'Gill Sans','lucida grande', helvetica, arial, sans-serif; + font-size: 165%; +} +h4 { + color: #993; + font-weight: normal; +} +ul, li { + margin: 0 12px; +} + +/** Layout **/ +#container { + text-align: left; +} + +#header{ + padding: 10px 20px; +} +#header h1 { + line-height:20px; + background: #003d4c url('../img/cake.icon.png') no-repeat left; + color: #fff; + padding: 0px 30px; +} +#header h1 a { + color: #fff; + background: #003d4c; + font-weight: normal; + text-decoration: none; +} +#header h1 a:hover { + color: #fff; + background: #003d4c; + text-decoration: underline; +} +#content{ + background: #fff; + clear: both; + color: #333; + padding: 10px 20px 40px 20px; + overflow: auto; +} +#footer { + clear: both; + padding: 6px 10px; + text-align: right; +} + +/** containers **/ +div.form, +div.index, +div.view { + float:right; + width:76%; + border-left:1px solid #666; + padding:10px 2%; +} +div.actions { + float:left; + width:16%; + padding:10px 1.5%; +} +div.actions h3 { + padding-top:0; + color:#777; +} + + +/** Tables **/ +table { + background: #fff; + border-right:0; + clear: both; + color: #333; + margin-bottom: 10px; + width: 100%; +} +th { + border:0; + border-bottom:2px solid #555; + text-align: left; + padding:4px; +} +th a { + display: block; + padding: 2px 4px; + text-decoration: none; +} +th a.asc:after { + content: ' ⇣'; +} +th a.desc:after { + content: ' ⇡'; +} +table tr td { + background: #fff; + padding: 6px; + text-align: left; + vertical-align: top; + border-bottom:1px solid #ddd; +} +table tr:nth-child(2n) td { + background: #f5f5f5; +} +table .altrow td { + background: #f5f5f5; +} +td.actions { + text-align: center; + white-space: nowrap; +} +table td.actions a { + margin: 0px 6px; + padding:2px 5px; +} +.cake-sql-log table { + background: #f4f4f4; +} +.cake-sql-log td { + padding: 4px 8px; + text-align: left; + font-family: Monaco, Consolas, "Courier New", monospaced; +} +.cake-sql-log caption { + color:#fff; +} + +/** Paging **/ +div.paging { + background:#fff; + color: #ccc; + margin-top: 1em; + clear:both; +} +div.paging span.disabled { + color: #ddd; + display: inline; +} +div.paging span.current { + color: #c73e14; +} +div.paging span a { +} + +/** Scaffold View **/ +dl { + line-height: 2em; + margin: 0em 0em; + width: 80%; +} +dl .altrow { + background: #f4f4f4; +} +dt { + font-weight: bold; + padding-left: 4px; + vertical-align: top; +} +dd { + margin-left: 15em; + margin-top: -2em; + vertical-align: top; +} + +/** Forms **/ +form { + clear: both; + margin-right: 20px; + padding: 0; + width: 95%; +} +fieldset { + border: 1px solid #ccc; + margin-bottom: 1em; + padding: 16px 20px; +} +fieldset legend { + background:#fff; + color: #e32; + font-size: 160%; + font-weight: bold; +} +fieldset fieldset { + margin-top: 0px; + margin-bottom: 20px; + padding: 16px 10px; +} +fieldset fieldset legend { + font-size: 120%; + font-weight: normal; +} +fieldset fieldset div { + clear: left; + margin: 0 20px; +} +form div { + clear: both; + margin-bottom: 1em; + padding: .5em; + vertical-align: text-top; +} +form .input { + color: #444; +} +form .required { + font-weight: bold; +} +form .required label:after { + color: #e32; + content: '*'; + display:inline; +} +form div.submit { + border: 0; + clear: both; + margin-top: 10px; +} +label { + display: block; + font-size: 110%; + margin-bottom:3px; +} +input, textarea { + clear: both; + font-size: 140%; + font-family: "frutiger linotype", "lucida grande", "verdana", sans-serif; + padding: 1%; + width:98%; +} +select { + clear: both; + font-size: 120%; + vertical-align: text-bottom; +} +select[multiple=multiple] { + width: 100%; +} +option { + font-size: 120%; + padding: 0 3px; +} +input[type=checkbox] { + clear: left; + float: left; + margin: 0px 6px 7px 2px; + width: auto; +} +div.checkbox label { + display: inline; +} +input[type=radio] { + float:left; + width:auto; + margin: 0 3px 7px 0; +} +div.radio label { + margin: 0 0 6px 20px; +} +input[type=submit] { + display: inline; + font-size: 110%; + width: auto; +} +form .submit input[type=submit] { + background:#62af56; + background: -webkit-gradient(linear, left top, left bottom, from(#a8ea9c), to(#62af56)); + background-image: -moz-linear-gradient(top, #a8ea9c, #62af56); + border-color: #2d6324; + color: #000; + text-shadow: #8cee7c 0px 1px 0px; +} +form .submit input[type=submit]:hover { + background:#4ca83d; + background: -webkit-gradient(linear, left top, left bottom, from(#85e573), to(#4ca83d)); + background-image: -moz-linear-gradient(top, #85e573, #4ca83d); +} + +/** Notices and Errors **/ +div.message { + clear: both; + color: #fff; + font-size: 140%; + font-weight: bold; + margin: 0 0 1em 0; + background: #c73e14; + padding: 5px; +} +div.error-message { + clear: both; + color: #fff; + font-weight: bold; + background: #c73e14; +} +p.error { + background-color: #e32; + color: #fff; + font-family: Courier, monospace; + font-size: 120%; + line-height: 140%; + padding: 0.8em; + margin: 1em 0; +} +p.error em { + color: #000; + font-weight: normal; + line-height: 140%; +} +.notice { + background: #ffcc00; + color: #000; + display: block; + font-family: Courier, monospace; + font-size: 120%; + line-height: 140%; + padding: 0.8em; + margin: 1em 0; +} +.success { + background: green; + color: #fff; +} + +/** Actions **/ +div.actions ul { + margin: 0; + padding: 0; +} +div.actions li { + margin:0 0 0.5em 0; + list-style-type: none; + white-space: nowrap; + padding: 0; +} +div.actions ul li a { + font-weight: normal; + display: block; + clear: both; +} +div.actions ul li a:hover { + text-decoration: underline; +} + +input[type=submit], +div.actions ul li a, +td.actions a { + font-weight:normal; + padding: 4px 8px; + background:#e6e49f; + background: -webkit-gradient(linear, left top, left bottom, from(#f1f1d4), to(#e6e49f)); + background-image: -moz-linear-gradient(top, #f1f1d4, #e6e49f); + color:#333; + border:1px solid #aaac62; + -webkit-border-radius:8px; + -moz-border-radius:8px; + border-radius:8px; + text-decoration:none; + text-shadow: #fff 0px 1px 0px; + min-width: 0; +} +input[type=submit]:hover, +div.actions ul li a:hover, +td.actions a:hover { + background: #f0f09a; + background: -webkit-gradient(linear, left top, left bottom, from(#f7f7e1), to(#eeeca9)); +} + +/** Related **/ +div.related { + clear: both; + display: block; +} + +/** Debugging **/ +pre { + color: #000; + background: #f0f0f0; + padding: 1em; +} +pre.cake-debug { + background: #ffcc00; + font-size: 120%; + line-height: 140%; + margin-top: 1em; + overflow: auto; + position: relative; +} +div.cake-stack-trace { + background: #fff; + color: #333; + margin: 0px; + padding: 6px; + font-size: 120%; + line-height: 140%; + overflow: auto; + position: relative; +} +div.cake-code-dump pre { + position: relative; + overflow: auto; +} +div.cake-stack-trace pre, div.cake-code-dump pre { + color: #000; + background-color: #F0F0F0; + margin: 0px; + padding: 1em; + overflow: auto; +} +div.cake-code-dump pre, div.cake-code-dump pre code { + clear: both; + font-size: 12px; + line-height: 15px; + margin: 4px 2px; + padding: 4px; + overflow: auto; +} +div.cake-code-dump span.code-highlight { + background-color: #ff0; + padding: 4px; +} +div.code-coverage-results div.code-line { + padding-left:5px; + display:block; + margin-left:10px; +} +div.code-coverage-results div.uncovered span.content { + background:#ecc; +} +div.code-coverage-results div.covered span.content { + background:#cec; +} +div.code-coverage-results div.ignored span.content { + color:#aaa; +} +div.code-coverage-results span.line-num { + color:#666; + display:block; + float:left; + width:20px; + text-align:right; + margin-right:5px; +} +div.code-coverage-results span.line-num strong { + color:#666; +} +div.code-coverage-results div.start { + border:1px solid #aaa; + border-width:1px 1px 0px 1px; + margin-top:30px; + padding-top:5px; +} +div.code-coverage-results div.end { + border:1px solid #aaa; + border-width:0px 1px 1px 1px; + margin-bottom:30px; + padding-bottom:5px; +} +div.code-coverage-results div.realstart { + margin-top:0px; +} +div.code-coverage-results p.note { + color:#bbb; + padding:5px; + margin:5px 0 10px; + font-size:10px; +} +div.code-coverage-results span.result-bad { + color: #a00; +} +div.code-coverage-results span.result-ok { + color: #fa0; +} +div.code-coverage-results span.result-good { + color: #0a0; +} \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/grid.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/grid.css new file mode 100755 index 000000000..f39ac87fd --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/grid.css @@ -0,0 +1,493 @@ +/* + 960 Grid System ~ Core CSS. + Learn more ~ http://960.gs/ + + Licensed under GPL and MIT. + + WebTT template based on 960 Grid System (http://960.gs/) +*/ + +/* =Containers +--------------------------------------------------------------------------------*/ + +.container_12, +.container_16 +{ + width: 92%; + margin-left: 4%; + margin-right: 4%; +} + +/* =Grid >> Global +--------------------------------------------------------------------------------*/ + +.grid_1, +.grid_2, +.grid_3, +.grid_4, +.grid_5, +.grid_6, +.grid_7, +.grid_8, +.grid_9, +.grid_10, +.grid_11, +.grid_12, +.grid_13, +.grid_14, +.grid_15, +.grid_16 +{ + display: inline; + float: left; + margin-left: 1%; + margin-right: 1%; +} + +.container_12 .grid_3, +.container_16 .grid_4 +{ + width: 23%; +} + +.container_12 .grid_6, +.container_16 .grid_8 +{ + width: 48%; +} + +.container_12 .grid_9, +.container_16 .grid_12 +{ + width: 73%; +} + +.container_12 .grid_12, +.container_16 .grid_16 +{ + width: 98%; +} + +/* =Grid >> Children (Alpha ~ First, Omega ~ Last) +--------------------------------------------------------------------------------*/ + +.alpha +{ + margin-left: 0; +} + +.omega +{ + margin-right: 0; +} + +/* =Grid >> 12 Columns +--------------------------------------------------------------------------------*/ + +.container_12 .grid_1 +{ + width: 6.333%; +} + +.container_12 .grid_2 +{ + width: 14.666%; +} + +.container_12 .grid_4 +{ + width: 31.333%; +} + +.container_12 .grid_5 +{ + width: 39.666%; +} + +.container_12 .grid_7 +{ + width: 56.333%; +} + +.container_12 .grid_8 +{ + width: 64.666%; +} + +.container_12 .grid_10 +{ + width: 81.333%; +} + +.container_12 .grid_11 +{ + width: 89.666%; +} + +/* =Grid >> 16 Columns +--------------------------------------------------------------------------------*/ + +.container_16 .grid_1 +{ + width: 4.25%; +} + +.container_16 .grid_2 +{ + width: 10.5%; +} + +.container_16 .grid_3 +{ + width: 16.75%; +} + +.container_16 .grid_5 +{ + width: 29.25%; +} + +.container_16 .grid_6 +{ + width: 35.5%; +} + +.container_16 .grid_7 +{ + width: 41.75%; +} + +.container_16 .grid_9 +{ + width: 54.25%; +} + +.container_16 .grid_10 +{ + width: 60.5%; +} + +.container_16 .grid_11 +{ + width: 66.75%; +} + +.container_16 .grid_13 +{ + width: 79.25%; +} + +.container_16 .grid_14 +{ + width: 85.5%; +} + +.container_16 .grid_15 +{ + width: 91.75%; +} + +/* =Prefix Extra Space >> Global +--------------------------------------------------------------------------------*/ + +.container_12 .prefix_3, +.container_16 .prefix_4 +{ + padding-left: 25%; +} + +.container_12 .prefix_6, +.container_16 .prefix_8 +{ + padding-left: 50%; +} + +.container_12 .prefix_9, +.container_16 .prefix_12 +{ + padding-left: 75%; +} + +/* =Prefix Extra Space >> 12 Columns +--------------------------------------------------------------------------------*/ + +.container_12 .prefix_1 +{ + padding-left: 8.333%; +} + +.container_12 .prefix_2 +{ + padding-left: 16.666%; +} + +.container_12 .prefix_4 +{ + padding-left: 33.333%; +} + +.container_12 .prefix_5 +{ + padding-left: 41.666%; +} + +.container_12 .prefix_7 +{ + padding-left: 58.333%; +} + +.container_12 .prefix_8 +{ + padding-left: 66.666%; +} + +.container_12 .prefix_10 +{ + padding-left: 83.333%; +} + +.container_12 .prefix_11 +{ + padding-left: 91.666%; +} + +/* =Prefix Extra Space >> 16 Columns +--------------------------------------------------------------------------------*/ + +.container_16 .prefix_1 +{ + padding-left: 6.25%; +} + +.container_16 .prefix_2 +{ + padding-left: 12.5%; +} + +.container_16 .prefix_3 +{ + padding-left: 18.75%; +} + +.container_16 .prefix_5 +{ + padding-left: 31.25%; +} + +.container_16 .prefix_6 +{ + padding-left: 37.5%; +} + +.container_16 .prefix_7 +{ + padding-left: 43.75%; +} + +.container_16 .prefix_9 +{ + padding-left: 56.25%; +} + +.container_16 .prefix_10 +{ + padding-left: 62.5%; +} + +.container_16 .prefix_11 +{ + padding-left: 68.75%; +} + +.container_16 .prefix_13 +{ + padding-left: 81.25%; +} + +.container_16 .prefix_14 +{ + padding-left: 87.5%; +} + +.container_16 .prefix_15 +{ + padding-left: 93.75%; +} + +/* =Suffix Extra Space >> Global +--------------------------------------------------------------------------------*/ + +.container_12 .suffix_3, +.container_16 .suffix_4 +{ + padding-right: 25%; +} + +.container_12 .suffix_6, +.container_16 .suffix_8 +{ + padding-right: 50%; +} + +.container_12 .suffix_9, +.container_16 .suffix_12 +{ + padding-right: 75%; +} + +/* =Suffix Extra Space >> 12 Columns +--------------------------------------------------------------------------------*/ + +.container_12 .suffix_1 +{ + padding-right: 8.333%; +} + +.container_12 .suffix_2 +{ + padding-right: 16.666%; +} + +.container_12 .suffix_4 +{ + padding-right: 33.333%; +} + +.container_12 .suffix_5 +{ + padding-right: 41.666%; +} + +.container_12 .suffix_7 +{ + padding-right: 58.333%; +} + +.container_12 .suffix_8 +{ + padding-right: 66.666%; +} + +.container_12 .suffix_10 +{ + padding-right: 83.333%; +} + +.container_12 .suffix_11 +{ + padding-right: 91.666%; +} + +/* =Suffix Extra Space >> 16 Columns +--------------------------------------------------------------------------------*/ + +.container_16 .suffix_1 +{ + padding-right: 6.25%; +} + +.container_16 .suffix_2 +{ + padding-right: 16.5%; +} + +.container_16 .suffix_3 +{ + padding-right: 18.75%; +} + +.container_16 .suffix_5 +{ + padding-right: 31.25%; +} + +.container_16 .suffix_6 +{ + padding-right: 37.5%; +} + +.container_16 .suffix_7 +{ + padding-right: 43.75%; +} + +.container_16 .suffix_9 +{ + padding-right: 56.25%; +} + +.container_16 .suffix_10 +{ + padding-right: 62.5%; +} + +.container_16 .suffix_11 +{ + padding-right: 68.75%; +} + +.container_16 .suffix_13 +{ + padding-right: 81.25%; +} + +.container_16 .suffix_14 +{ + padding-right: 87.5%; +} + +.container_16 .suffix_15 +{ + padding-right: 93.75%; +} + +/* =Clear Floated Elements +--------------------------------------------------------------------------------*/ + +/* http://sonspring.com/journal/clearing-floats */ + +html body * span.clear, +html body * div.clear, +html body * li.clear, +html body * dd.clear +{ + background: none; + border: 0; + clear: both; + display: block; + float: none; + font-size: 0; + list-style: none; + margin: 0; + padding: 0; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; +} + +/* http://www.positioniseverything.net/easyclearing.html */ + +.clearfix:after +{ + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix +{ + display: inline-block; +} + +* html .clearfix +{ + height: 1%; +} + +.clearfix +{ + display: block; +} \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/ie.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/ie.css new file mode 100755 index 000000000..1394ddd85 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/ie.css @@ -0,0 +1,33 @@ +/* + Fluid 960 Grid System - IE Fixes (IE7 and greater) + Learn more ~ http://www.designinfluences.com/ + + Licensed under GPL and MIT. + + WebTT template based on 960 Grid System (http://960.gs/) +*/ + +/* =Grid >> Global +--------------------------------------------------------------------------------*/ + +.grid_1, +.grid_2, +.grid_3, +.grid_4, +.grid_5, +.grid_6, +.grid_7, +.grid_8, +.grid_9, +.grid_10, +.grid_11, +.grid_12, +.grid_13, +.grid_14, +.grid_15, +.grid_16 +{ + margin-left: .92%; + margin-right: .92%; +} + diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/ie6.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/ie6.css new file mode 100755 index 000000000..091e11747 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/ie6.css @@ -0,0 +1,33 @@ +/* + Fluid 960 Grid System - IE6 Fixes + Learn more ~ http://www.designinfluences.com/ + + Licensed under GPL and MIT. + + WebTT template based on 960 Grid System (http://960.gs/) +4*/ + +/* =Grid >> Global +--------------------------------------------------------------------------------*/ + +.grid_1, +.grid_2, +.grid_3, +.grid_4, +.grid_5, +.grid_6, +.grid_7, +.grid_8, +.grid_9, +.grid_10, +.grid_11, +.grid_12, +.grid_13, +.grid_14, +.grid_15, +.grid_16 +{ + margin-left: .8%; + margin-right: .8%; +} + diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/layout.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/layout.css new file mode 100755 index 000000000..259166d09 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/layout.css @@ -0,0 +1,769 @@ +/* WebTT template based on 960 Grid System (http://960.gs/) + +----------------------------------------------- +Grey Box Method - Layout CSS +----------------------------------------------- */ + +body { + background: #000 ; + background-image: url("http://www.ryzom.com/data/bg.jpg"); + background-attachment:fixed; + background-repeat: repeat-x; +// border-top: 5px solid #000; + margin-top: 5px; +// color: #333; + color: #ddd; + font-size: 11px; + padding: 0 0 40px; +} + + +/* anchors +----------------------------------------------- */ +a { +// color: #000; + color: inherit; + font-weight:bold; + text-decoration: none; +} +a:hover { +// color:#333; +// text-decoration: underline; +// text-shadow: #6374AB 0px 0px 2px; + text-shadow: #84AFBD 0px 0px 2px; +} + + +/* 960 grid system container background +----------------------------------------------- */ +.container_12, +.container_16 { + background: rgb(71,71,71); + background: rgba(0,0,0, 0.6); + border: 1px solid rgb(110,110,110); + border: 1px solid rgba(255,255,255, 0.5); +} + + +/* headings +----------------------------------------------- */ +h1, h2, h3, h4, h5, h6 {line-height:1.2em; margin-bottom:.3em;} +h2 {margin-top:1em;} +h5 {font-size:1.2em;} +h6 {font-size:1em; text-transform:uppercase;} + + +h1 a { + font-weight:normal; + color: #ddd; +} +h1 a:hover { + font-weight:normal; + color: #ddd; +} + + +/* branding +----------------------------------------------- */ +h1#branding { + font-weight:normal; + font-size:3em; + text-align:left; + background:#aaa; + padding:.7em 1em; + margin-bottom:0; +} + + +/* page heading +----------------------------------------------- */ +h2#page-heading { + font-weight:normal; + padding:.5em; + margin:0 0 10px 0; + border-bottom:1px solid #ccc; +} + + +/* boxes +----------------------------------------------- */ +.box { +// background:rgb(210,210,210); +// background:rgba(255,255,255,0.81); + margin-bottom:20px; + padding:10px 10px 1px 10px; +// color: #333; + color: #ddd; + border: 1px solid rgb(71,71,71); + border: 1px solid rgba(255,255,255,0.4); +} +.box h2 { + font-size:1em; + font-weight:normal; + text-transform:uppercase; + color:#fff; +// background:#333; + background:rgb(31,31,31); + background:rgba(90,90,0,0.6); + margin:-10px -10px 0 -10px; + padding:6px 12px; +} +.box h2 a, +.box h2 a.visible { +// color:#fff; + color: #ddd; +// background:#333 url("../img/switch_minus.gif") 97% 50% no-repeat; + background:url("../img/switch_minus.gif") 97% 50% no-repeat; + background:url("../img/switch_minus.gif") 97% 50% no-repeat; + display:block; + padding:6px 12px; + margin:-6px -12px; + border:none; +} +.box h2 a.hidden, +.box h2 a.hidden:hover { + background-image: url("../img/switch_plus.gif"); +} +.box h2 a:hover { + background-color:#111; +} + +.menubox { + padding:0px; + color: #333; +} +.menubox .inbox { + background:rgb(210,210,210); + background:rgba(255,255,255,0.81); + padding: 0px 10px 1px; +} +.inbox a { + color: #000; +} +.menubox h2 { + margin: 0px; +} +.menubox h2 a, +.menubox h2 a.visible { + background:rgb(31,31,31) url("../img/switch_minus.gif") 97% 50% no-repeat; + background:rgba(90,90,0,0.6) url("../img/switch_minus.gif") 97% 50% no-repeat; +} +.menubox h2 a:hover { + background-color:#111; +} + +.grid_4 .box h2 a { + background-position: 97% 50%; +} +.grid_5 .box h2 a { + background-position: 98% 50%; +} +.grid_12 .box h2 a { + background-position: 99% 50%; +} + + +.block { + padding-top:10px; +} +div.menu { + padding:0; +} +div.menu h2 { + margin:0; +} +div.menu .block { + padding-top:0; +} + + +/* paragraphs, quotes and lists +----------------------------------------------- */ +p { + margin-bottom:1em; +} +blockquote { + font-family: Georgia, 'Times New Roman', serif; + font-size:1.2em; + padding-left:1em; + border-left:4px solid #ccc; +} +blockquote cite { + font-size:.9em; +} +ul, ol { + padding-top:0; +} + + +/* menus +----------------------------------------------- */ +ul.menu { + list-style:none; + border-top:1px solid #bbb; +} +ul.menu li { + margin:0; +} +ul.menu li a { + display:block; + padding:4px 10px; + border-bottom:1px solid #ccc; +} +ul.menu li a:hover { + background:#eee; +} +ul.menu li a:active { + background:#ccc; +} + + +/* submenus +----------------------------------------------- */ +ul.menu ul { + list-style:none; + margin:0; +} +ul.menu ul li a { + padding-left:30px; +} + + +/* section menus +----------------------------------------------- */ +ul.section { + border-top:0; + margin-bottom:0; +} +ul.section li { + text-transform:uppercase; +} +ul.section li a { + background:#bbb; +} +ul.section li a:hover { + background:#aaa; +} +ul.section li a:active { + color:#fff; + background:#666; +} +ul.section li li a { + background:#ddd; + border-bottom:1px solid #eee; +} +ul.section li li a:hover { + background:#ccc; +} +ul.section li li a:active { + color:#000; + background:#fff; +} +ul.section ul li { + text-transform:none; +} +ul.section ul.current li a { + background:#eee; + border-bottom:1px solid #fff; +} +ul.section ul.current li a:hover { + background:#ddd; +} +ul.section ul.current li a:active { + background:#fff; +} +ul.section li a.current { + color:#fff; + background:#666; +} +ul.section li a.current:hover { + background:#555; +} +ul.section li a.current:active { + background:#444; +} +ul.section li a.active { + background:#fff; + cursor:default; +} +ul.section li.current > a.active, +ul.section li.current > a.active:hover { + color:#fff; + background:#666; + cursor:default; +} + + +/* table +----------------------------------------------- */ +table { + width:100%; +// border:1px solid #bbb; + border:1px solid #aaa; +// border: 1px solid rgba(0,0,0,0.55); + margin-bottom:10px; +} +col.colC { + width:8em; +} +th, td { + padding:.2em 1em; + text-align:left; + color: #333; +} +thead th { + border-bottom:2px solid #888; + background: #eee; + background:rgba(212,222,255,0.65); + padding:.4em 1em .2em; +} +thead th.table-head { + font-size:1em; + font-weight:normal; + text-transform:uppercase; + color:#fff; + background:#555; + border:1px solid #555; +} +tbody th, +tbody td { + border-top:1px solid #bbb; + border-bottom:1px solid #bbb; + background:#eee; + background:rgba(255,255,255,0.85); +} +tbody tr.odd th, +tbody tr.odd td { + background:#fff; +} +tfoot th, +tfoot td { + border-top:2px solid #666; + background:#eee; + background:rgba(212,222,255,0.65); +} +tfoot tr.total th, +tfoot tr.total td { + border-top:6px double #666; +} +tfoot tr.total th { + text-transform:uppercase; +} +th.currency, +td.currency { + text-align:right; +} +tfoot.dark th, tfoot.dark td { +// background: #bbbbbb; +} + + +/* forms +----------------------------------------------- */ +form { + overflow:hidden; +} +fieldset { + border:1px solid #bbb; + padding:10px; + position:relative; + background:#e9e9e9; + background:rgba(255,255,255,0.81); + margin-bottom:10px; + color: #333; +} +legend { + font-size:1.1em; + padding:.4em .8em; + background:#f5f5f5; + border:1px solid #bbb; +} +fieldset.login p { + margin-bottom:1em; + margin-top:0pt; +} +fieldset p label { + width:98%; +} +fieldset p input { + width:98%; +} +fieldset p select { + width:99%; +} +fieldset.login p label { + float:left; + line-height:2em; + margin-right:3%; + text-align:right; + width:32%; +} +fieldset.login p input { + width:60%; +} +fieldset.login input.button { + margin-left:35%; +} +form p.notice { + font-weight:bold; +} +input.search.text { + width:66%; +} +input.search.button { + width:28%; + margin-left:2%; +} + + +/* articles +----------------------------------------------- */ +.articles { + padding:0; +} +.articles h2 { + margin:0; +} +#articles { + padding-top:0; +} +.article { + border-top:1px solid #666; + padding-top:.5em; +} +.box .article { + border-top:3px solid #fff; + padding:13px 10px 0 10px; +} +.article h2 { + font-size:2em; + font-weight:normal; + text-transform:none; + color:#333; + background:transparent; + padding:0; + margin:0; + border:none; +} +.article h3 { + margin-bottom:.2em; + font-size:1.6em; +} +.box .first { + border-top:none; +} +.article h4 { + font-size:1.2em; + text-transform:uppercase; + margin-bottom:.5em; +} +.article a.image { + float:left; + margin:3px 10px 3px 0; + padding:4px; + border:1px solid #bbb; + background:#fff; +} +.article a.image:hover { + border:1px solid #666; +} +.article a.image img { + float:left; +} +.article p.meta { + color:#666; + border-top:1px dotted #999; + border-bottom:1px dotted #999; + padding:.3em 0; + margin-bottom:.8em; +} + + +/* site information +----------------------------------------------- */ +#site_info .box { + color:#ccc; + background:#666; + margin-bottom:10px; +} +#site_info a { + color:#fff; +} +#site_info a:hover { + color:#000; +} + + +/* AJAX sliding shelf +----------------------------------------------- */ +#loading {float:right; margin-right:14px; margin-top:-2px;} +.block {padding-bottom:1px;} + + +/* Accordian +----------------------------------------------- */ +.toggler { + color: #222; + margin: 0; + padding: 2px 5px; + background: #eee; + border-bottom: 1px solid #ddd; + border-right: 1px solid #ddd; + border-top: 1px solid #f5f5f5; + border-left: 1px solid #f5f5f5; + font-size:1.1em; + font-weight: normal; +} +.element h4 { + margin: 0; + padding:4px; + line-height:1.2em; +} +.element p { + margin: 0; + padding: 4px; +} +.float-right { + padding:10px 20px; + float:right; +} + +#accordian-block { + padding-bottom:10px; +} + + +/* Mootools Kwicks +----------------------------------------------- */ +#kwick-box { + padding:0; + overflow:hidden; +} +#kwick-box h2 { + margin:0; +} +#kwick { + position: relative; +} +#kwick .kwicks { + display: block; + background: #999; + height: 120px; + list-style:none; + margin:0; + overflow:hidden; +} +#kwick li { + float: left; + margin:0; + padding:0; +} +#kwick .kwick { + display: block; + cursor: pointer; + overflow: hidden; + height: 100px; + width: 215px; + padding: 10px; + background: #fff; +} +#kwick .kwick span { + color:#fff; +} +#kwick .one { + background: #666; +} +#kwick .two { + background: #777; +} +#kwick .three { + background: #888; +} +#kwick .four { + background: #999; +} +/* Main Nav Current States */ +ul.nav li a.current { + background: #888; +} + +/* CakePHP Specific */ +div#flashMessage { + padding: 10px; + margin: 0px 13px 10px 11px; + border: 1px dashed #888; + background: #ffcccc; + font-size: 14px; +} +div.flash-error { + color: #bf0000; + background: #ffbfbf !important; + border-color: #bf0000 !important; +} +div.flash-warning { + color: #725600; + background: #ffffbf !important; + border-color: #bfbf00 !important; +} +div.flash-success { + color: #00bf00; + background: #dfffbf !important; + border-color: #00bf00 !important; +} +div.error-message { + color: #bf0000; + font-weight: bold; +} +div.form div.box { + padding: 10px; + background:#e9e9e9; + background: none repeat scroll 0 0 rgba(255, 255, 255, 0.81); +} +.input { + margin: 0px 0px 5px 0px; +} +.text input { + width: 250px; +} +.input label { + width: 100px; + text-align: right; + display: block; + float: left; + margin: 0px 5px 0px 0px; + padding: 2px 0px 0px 0px; +} +.text label { + padding: 6px 0px 0px 0px; +} +.form-submit-group { + float: right; + margin: 0px 0px 5px 0px; +} +.form-submit-group .submit { + float: left; +} +.form-cancel { + float: left; + padding-top: 5px; + margin-right: 5px; +} +/** Scaffold View **/ +dl { + line-height: 2em; + margin: 0em 0em; + width: 60%; +} +div.dl { + border: 1px solid #aaa; + color: #333; + margin-bottom: 10px; +} +div.dh { + background: none repeat scroll 0 0 rgba(212, 222, 255, 0.65); + padding: 0.4em 1em 0.2em; + font-weight: bold; + border-bottom: 1px solid #888888; + border-top: 0px none; +} +.dt, .dd { + padding: 0.4em 1em 0.2em; + border-top: 1px solid #888888; +} +div.dt { + float: left; + width: 10em; + background: transparent; + font-weight: bold; +} +.dd { + background: none repeat scroll 0 0 rgba(255, 255, 255, 0.85); +} +.dd:after { + clear: both; +} +dl .altrow, div .altrow { + background: #f4f4f4; +} +dt { + font-weight: bold; + padding-left: 4px; + vertical-align: top; +} +dd { + margin-left: 10em; + margin-top: -2em; + vertical-align: top; +} +/** CakePHP Notices and Errors **/ +div.message { + clear: both; + color: #333; + font-size: 140%; + font-weight: bold; + margin: 0 0 1em 0; + background: #c73e14; + padding: 5px; +} +div.error-message { + clear: both; + color: #bf0000; + background: #ffbfbf; + border-color: #bf0000; + font-weight: bold; +} +p.error { + color: #bf0000; + background: #ffbfbf; + border-color: #bf0000; + font-family: Courier, monospace; + font-size: 120%; + line-height: 140%; + padding: 0.8em; + margin: 1em 0; +} +p.error em { + color: #000; + font-weight: normal; + line-height: 140%; +} +.notice { + color: #725600; + background: #ffffbf; + border-color: #bfbf00; + display: block; + font-family: Courier, monospace; + font-size: 120%; + line-height: 140%; + padding: 0.8em; + margin: 1em 0; +} +.success { + color: #00bf00; + background: #dfffbf; + border-color: #00bf00; +} + +/* jQuery UI Stuff */ +#ui-datepicker-div { + background: #fff; + padding: 5px; + border: 1px solid #eee; +} +a.ui-datepicker-prev { + width: 35px; + float: left; + text-align: left; +} +a.ui-datepicker-next { + width: 35px; + float: right; + text-align: right; +} +div.ui-datepicker-title { + text-align: center; +} +table.ui-datepicker-calendar { + padding-bottom: 0px; + margin-bottom: 0px; +} diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/nav.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/nav.css new file mode 100755 index 000000000..cb4bf108e --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/nav.css @@ -0,0 +1,168 @@ +/* WebTT template based on 960 Grid System (http://960.gs/) + +----------------------------------------------- +Navigation +----------------------------------------------- */ + +/* navigation (horizontal subnavigation) +----------------------------------------------- */ +ul.nav, +ul.nav * { margin:0;padding:0;} +ul.nav { + position:relative; + background:#666; + max-width:100%; + height:2.5em; + } +ul.nav li { + cursor:pointer; + float:left; + text-align:center; + list-style-type:none; + font-weight:normal; +} +ul.nav li ul { + cursor:default; + width:100%; + max-width:100%; + position:absolute; + height:auto; + top:2.5em; + background-position:0 0 !important; + left:-9000px; +} +ul.nav li ul li { + padding:0; + border:none; + width:auto; + max-width:none; +} +ul.nav li a { + color:#fff; + background:#666; + font-weight:bold; + text-decoration:none; + display:block; + float:left; + padding:0 1em; + height:2.4em; + line-height:2.5em; +} +ul.nav li ul li a { + position:relative !important; /* ie Mac */ + cursor:pointer !important; + white-space:nowrap; + line-height:2em; + height:2em; + font-weight:normal; + color:#666; + background-position:0 50% !important; +} + +ul.nav li:hover a, +ul.nav li a:hover, +ul.nav li a:focus {color:#000; background:#ccc;} +ul.nav li a:active {color:#666; background:#fff;} +ul.nav li:hover ul {left:0;z-index:10} +ul.nav li ul, +ul.nav li {background:#ccc !important} +ul.nav li:hover ul li a {color:#444;} +ul.nav li:hover ul li a:hover {color:#000; background:#fff;} +ul.nav li:hover ul li a:active {color:#666; background:#fff;} + +ul.nav li.current a {color:#666; background:#fff; cursor:default; font-weight:bold;} +ul.nav li.current ul {left:0;z-index:5} +ul.nav li.current ul, +ul.nav li.current {background:#ccc !important} +ul.nav li.current ul li a {color:#444; background:#ccc; font-weight:normal;} +ul.nav li.current ul li a:hover {color:#000; background:#fff;} +ul.nav li ul li.current a, +ul.nav li ul li.current a:hover, +ul.nav li.current:hover ul li a:active {color:#666; background:#fff;} + + +/* navigation (vertical subnavigation) +----------------------------------------------- */ +ul.nav { + background:#666; +} +ul.main li { + position:relative; + top:0; + left:0; +} +ul.main li ul { + border-top:0; +} +ul.main li ul li { + float:left; +} +ul.main li a { + height:2.5em; + line-height:2.5em; + border:0; + color:#fff; + background:#666; +} +ul.main li ul li a { + width:12em; + line-height:2em; + height:2em; + text-align:left; + color:#fff; + border-top:1px solid #444; + background:#444; +} +ul.main li a:focus {color:#fff; background:#666;} +ul.main li ul li a:hover { + color:#fff; + background:#555; +} +ul.main li:hover a { + color:#fff; + background:#555; +} +ul.main li:hover ul li a {color:#fff;} +ul.main li:hover ul li a:hover {color:#fff; background:#444;} +ul.main li:hover a:active {background:#444;} +ul.main li:hover ul li a:active {color:#fff; background:#222;} + + +/* secondary list +----------------------------------------------- */ +ul.nav li.secondary { + float:right; + color:#cde; + background:transparent !important; +} +ul.nav li.secondary span.status { + float:left; + padding:0 1em; + line-height:2.77em; + height:2.77em; + font-size:0.9em; +} +ul.nav li.secondary span.status a { + float:none; + display:inline; + padding:0; + height:auto; + line-height:auto; + color:#cde; + background:transparent; +} +ul.nav li.secondary span.status a:hover { + color:#fff; + background:transparent; +} +ul.nav li.secondary span.status span { + text-transform:capitalize; +} +ul.nav li.secondary:hover a { + color:#fff; + background:#666; +} +ul.nav li.secondary:hover a:hover { + background:#555; +} +ul.nav li.secondary:hover a:active {background:#444;} diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/reset.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/reset.css new file mode 100755 index 000000000..3aadd3dd6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/reset.css @@ -0,0 +1,53 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/css/text.css b/code/ryzom/tools/server/www/webtt/app/webroot/css/text.css new file mode 100755 index 000000000..a03be0190 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/css/text.css @@ -0,0 +1,100 @@ +/* + 960 Grid System ~ Text CSS. + Learn more ~ http://960.gs/ + + Licensed under GPL and MIT. + + WebTT template based on 960 Grid System (http://960.gs/) +*/ + +/* =Basic HTML +--------------------------------------------------------------------------------*/ + +body +{ + font: 13px/1.5 'lucida grande',verdana,helvetica,arial,'Liberation Sans', FreeSans, sans-serif +} + +a:focus +{ + outline: 1px dotted invert; +} + +hr +{ + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0; + clear: both; + height: 0; +} + +/* =Headings +--------------------------------------------------------------------------------*/ + +h1 +{ + font-size: 25px; +} + +h2 +{ + font-size: 23px; +} + +h3 +{ + font-size: 21px; +} + +h4 +{ + font-size: 19px; +} + +h5 +{ + font-size: 17px; +} + +h6 +{ + font-size: 15px; +} + +/* =Spacing +--------------------------------------------------------------------------------*/ + +ol +{ + list-style: decimal; +} + +ul +{ + list-style: square; +} + +li +{ + margin-left: 30px; +} + +p, +dl, +hr, +h1, +h2, +h3, +h4, +h5, +h6, +ol, +ul, +pre, +table, +address, +fieldset +{ + margin-bottom: 20px; +} \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/favicon.ico b/code/ryzom/tools/server/www/webtt/app/webroot/favicon.ico new file mode 100644 index 000000000..b36e81f2f Binary files /dev/null and b/code/ryzom/tools/server/www/webtt/app/webroot/favicon.ico differ diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/files/empty b/code/ryzom/tools/server/www/webtt/app/webroot/files/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/img/cake.icon.png b/code/ryzom/tools/server/www/webtt/app/webroot/img/cake.icon.png new file mode 100644 index 000000000..394fa42d5 Binary files /dev/null and b/code/ryzom/tools/server/www/webtt/app/webroot/img/cake.icon.png differ diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/img/cake.power.gif b/code/ryzom/tools/server/www/webtt/app/webroot/img/cake.power.gif new file mode 100644 index 000000000..8f8d570a2 Binary files /dev/null and b/code/ryzom/tools/server/www/webtt/app/webroot/img/cake.power.gif differ diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/index.php b/code/ryzom/tools/server/www/webtt/app/webroot/index.php new file mode 100644 index 000000000..396775b73 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/index.php @@ -0,0 +1,84 @@ +dispatch(); + } diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/js/empty b/code/ryzom/tools/server/www/webtt/app/webroot/js/empty new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-1.3.2.min.js b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-1.3.2.min.js new file mode 100644 index 000000000..b1ae21d8b --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-1.3.2.min.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-fluid16.js b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-fluid16.js new file mode 100755 index 000000000..08ab73d70 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-fluid16.js @@ -0,0 +1,103 @@ +var fluid = { +Ajax : function(){ + $("#loading").hide(); + var content = $("#ajax-content").hide(); + $("#toggle-ajax").bind("click", function(e) { + if ( $(this).is(".hidden") ) { + $("#ajax-content").empty(); + + $("#loading").show(); + $("#ajax-content").load("/fluid960gs/data/ajax-response.html", function() { + $("#loading").hide(); + content.slideDown(); + }); + } + else { + content.slideUp(); + } + if ($(this).hasClass('hidden')){ + $(this).removeClass('hidden').addClass('visible'); + } + else { + $(this).removeClass('visible').addClass('hidden'); + } + e.preventDefault(); + }); +}, +Toggle : function(){ + var default_hide = {"grid": true, "filter": true }; + $.each( + ["admin-left-menu", "admin-actions", "help", "filter", "related-records", "grid", "paragraphs", "blockquote", "list-items", "section-menu", "tables", "forms", "login-forms", "search", "articles", "accordion"], + function() { + var el = $("#" + (this == 'accordon' ? 'accordion-block' : this) ); + if (default_hide[this]) { + el.hide(); + $("[id='toggle-"+this+"']").addClass("hidden") + } + $("[id='toggle-"+this+"']") + .bind("click", function(e) { + if ($(this).hasClass('hidden')){ + $(this).removeClass('hidden').addClass('visible'); + el.slideDown(); + } else { + $(this).removeClass('visible').addClass('hidden'); + el.slideUp(); + } + e.preventDefault(); + }); + } + ); +}, +Kwicks : function(){ + var animating = false; + $("#kwick .kwick") + .bind("mouseenter", function(e) { + if (animating) return false; + animating == true; + $("#kwick .kwick").not(this).animate({ "width": 125 }, 200); + $(this).animate({ "width": 485 }, 200, function() { + animating = false; + }); + }); + $("#kwick").bind("mouseleave", function(e) { + $(".kwick", this).animate({ "width": 215 }, 200); + }); +}, +SectionMenu : function(){ + $("#section-menu") + .accordion({ + "header": "a.menuitem" + }) + .bind("accordionchangestart", function(e, data) { + data.newHeader.next().andSelf().addClass("current"); + data.oldHeader.next().andSelf().removeClass("current"); + }) + .find("a.menuitem:first").addClass("current") + .next().addClass("current"); +}, +Accordion: function(){ + $("#accordion").accordion({ + 'header': "h3.atStart" + }).bind("accordionchangestart", function(e, data) { + data.newHeader.css({ + "font-weight": "bold", + "background": "#fff" + }); + + data.oldHeader.css({ + "font-weight": "normal", + "background": "#eee" + }); + }).find("h3.atStart:first").css({ + "font-weight": "bold", + "background": "#fff" + }); +} +} +jQuery(function ($) { + if($("#accordion").length){fluid.Accordion();} + if($("[id$='ajax']").length){fluid.Ajax();} + if($("[id^='toggle']").length){fluid.Toggle();} + if($("#kwick .kwick").length){fluid.Kwicks();} + if($("#section-menu").length){fluid.SectionMenu();} +}); diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-ui.js b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-ui.js new file mode 100755 index 000000000..e6d1c0de4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/js/jquery-ui.js @@ -0,0 +1,298 @@ +/* + * jQuery UI 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.6rc6",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n){return}for(var m=0;m
').addClass(j).css({position:"absolute",top:"-5000px",left:"-5000px",display:"block"}).appendTo("body");c.ui.cssCache[j]=!!((!(/auto|default/).test(k.css("cursor"))||(/^[1-9]/).test(k.css("height"))||(/^[1-9]/).test(k.css("width"))||!(/none/).test(k.css("backgroundImage"))||!(/transparent|rgba\(0, 0, 0, 0\)/).test(k.css("backgroundColor"))));try{c("body").get(0).removeChild(k.get(0))}catch(l){}return c.ui.cssCache[j]},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=true;this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);/* + * jQuery UI Draggable 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.cssNamespace&&this.element.addClass(this.options.cssNamespace+"-draggable"));(this.options.disabled&&this.element.addClass(this.options.cssNamespace+"-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass(this.options.cssNamespace+"-draggable "+this.options.cssNamespace+"-draggable-dragging "+this.options.cssNamespace+"-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is("."+this.options.cssNamespace+"-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass(c.cssNamespace+"-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body&&a.browser.mozilla)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c)}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.leftthis.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y=p&&n<=k)||(m>=p&&m<=k)||(nk))&&((e>=g&&e<=c)||(d>=g&&d<=c)||(ec));break;default:return false;break}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,g){var b=a.ui.ddmanager.droppables[e.options.scope];var f=g?g.type:null;var h=(e.currentItem||e.element).find(":data(droppable)").andSelf();droppablesLoop:for(var d=0;d').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent();this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});if(b.browser.safari&&h.preventDefault){this.originalElement.css("resize","none")}this.proportionallyResize.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=h.handles||(!b(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var j=this.handles.split(",");this.handles={};for(var e=0;e');if(/sw|se|ne|nw/.test(g)){f.css({zIndex:++h.zIndex})}if("se"==g){f.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(o){o=o||this.element;for(var l in this.handles){if(this.handles[l].constructor==String){this.handles[l]=b(this.handles[l],this.element).show()}if(h.transparent){this.handles[l].css({opacity:0})}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var m=b(this.handles[l],this.element),n=0;n=/sw|ne|nw|se|n|s/.test(l)?m.outerHeight():m.outerWidth();var k=["padding",/ne|nw|n/.test(l)?"Top":/se|sw|s/.test(l)?"Bottom":/^e$/.test(l)?"Right":"Left"].join("");if(!h.transparent){o.css(k,n)}this._proportionallyResize()}if(!b(this.handles[l]).length){continue}}};this._renderAxis(this.element);this._handles=b(".ui-resizable-handle",this.element);if(h.disableSelection){this._handles.disableSelection()}this._handles.mouseover(function(){if(!d.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}d.axis=i&&i[1]?i[1]:"se"}});if(h.autoHide){this._handles.hide();b(this.element).addClass("ui-resizable-autohide").hover(function(){b(this).removeClass("ui-resizable-autohide");d._handles.show()},function(){if(!d.resizing){b(this).addClass("ui-resizable-autohide");d._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var c=function(d){b(d).removeClass("ui-resizable ui-resizable-disabled").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){c(this.element);this.wrapper.parent().append(this.originalElement.css({position:this.wrapper.css("position"),width:this.wrapper.outerWidth(),height:this.wrapper.outerHeight(),top:this.wrapper.css("top"),left:this.wrapper.css("left")})).end().remove()}c(this.originalElement)},_mouseCapture:function(d){var e=false;for(var c in this.handles){if(b(this.handles[c])[0]==d.target){e=true}}return this.options.disabled||!!e},_mouseStart:function(e){var h=this.options,d=this.element.position(),c=this.element;this.resizing=true;this.documentScroll={top:b(document).scrollTop(),left:b(document).scrollLeft()};if(c.is(".ui-draggable")||(/absolute/).test(c.css("position"))){c.css({position:"absolute",top:d.top,left:d.left})}if(b.browser.opera&&(/relative/).test(c.css("position"))){c.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var i=a(this.helper.css("left")),f=a(this.helper.css("top"));if(h.containment){i+=b(h.containment).scrollLeft()||0;f+=b(h.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:i,top:f};this.size=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalSize=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalPosition={left:i,top:f};this.sizeDiff={width:c.outerWidth()-c.width(),height:c.outerHeight()-c.height()};this.originalMousePosition={left:e.pageX,top:e.pageY};this.aspectRatio=(typeof h.aspectRatio=="number")?h.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);if(h.preserveCursor){var g=b(".ui-resizable-"+this.axis).css("cursor");b("body").css("cursor",g=="auto"?this.axis+"-resize":g)}this._propagate("start",e);return true},_mouseDrag:function(c){var f=this.helper,e=this.options,k={},n=this,h=this.originalMousePosition,l=this.axis;var p=(c.pageX-h.left)||0,m=(c.pageY-h.top)||0;var g=this._change[l];if(!g){return false}var j=g.apply(this,[c,p,m]),i=b.browser.msie&&b.browser.version<7,d=this.sizeDiff;if(this._aspectRatio||c.shiftKey){j=this._updateRatio(j,c)}j=this._respectSize(j,c);this._propagate("resize",c);f.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this.proportionallyResize.length){this._proportionallyResize()}this._updateCache(j);this._trigger("resize",c,this.ui());return false},_mouseStop:function(f){this.resizing=false;var g=this.options,k=this;if(this._helper){var e=this.proportionallyResize,c=e.length&&(/textarea/i).test(e[0].nodeName),d=c&&b.ui.hasScroll(e[0],"left")?0:k.sizeDiff.height,i=c?0:k.sizeDiff.width;var l={width:(k.size.width-i),height:(k.size.height-d)},h=(parseInt(k.element.css("left"),10)+(k.position.left-k.originalPosition.left))||null,j=(parseInt(k.element.css("top"),10)+(k.position.top-k.originalPosition.top))||null;if(!g.animate){this.element.css(b.extend(l,{top:j,left:h}))}if(this._helper&&!g.animate){this._proportionallyResize()}}if(g.preserveCursor){b("body").css("cursor","auto")}this._propagate("stop",f);if(this._helper){this.helper.remove()}return false},_updateCache:function(c){var d=this.options;this.offset=this.helper.offset();if(c.left){this.position.left=c.left}if(c.top){this.position.top=c.top}if(c.height){this.size.height=c.height}if(c.width){this.size.width=c.width}},_updateRatio:function(f,e){var g=this.options,h=this.position,d=this.size,c=this.axis;if(f.height){f.width=(d.height*this.aspectRatio)}else{if(f.width){f.height=(d.width/this.aspectRatio)}}if(c=="sw"){f.left=h.left+(d.width-f.width);f.top=null}if(c=="nw"){f.top=h.top+(d.height-f.height);f.left=h.left+(d.width-f.width)}return f},_respectSize:function(j,e){var r=function(o){return !isNaN(parseInt(o,10))};var h=this.helper,g=this.options,p=this._aspectRatio||e.shiftKey,n=this.axis,s=r(j.width)&&g.maxWidth&&(g.maxWidthj.width),q=r(j.height)&&g.minHeight&&(g.minHeight>j.height);if(f){j.width=g.minWidth}if(q){j.height=g.minHeight}if(s){j.width=g.maxWidth}if(k){j.height=g.maxHeight}var d=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height;var i=/sw|nw|w/.test(n),c=/nw|ne|n/.test(n);if(f&&i){j.left=d-g.minWidth}if(s&&i){j.left=d-g.maxWidth}if(q&&c){j.top=m-g.minHeight}if(k&&c){j.top=m-g.maxHeight}var l=!j.width&&!j.height;if(l&&!j.left&&j.top){j.top=null}else{if(l&&!j.top&&j.left){j.left=null}}return j},_proportionallyResize:function(){var h=this.options;if(!this.proportionallyResize.length){return}var e=this.helper||this.element;for(var d=0;d');var c=b.browser.msie&&b.browser.version<7,e=(c?1:0),f=(c?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++g.zIndex});this.helper.appendTo("body");if(g.disableSelection){this.helper.disableSelection()}}else{this.helper=this.element}},_change:{e:function(e,d,c){return{width:this.originalSize.width+d}},w:function(f,d,c){var h=this.options,e=this.originalSize,g=this.originalPosition;return{left:g.left+d,width:e.width-d}},n:function(f,d,c){var h=this.options,e=this.originalSize,g=this.originalPosition;return{top:g.top+c,height:e.height-c}},s:function(e,d,c){return{height:this.originalSize.height+c}},se:function(e,d,c){return b.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,d,c]))},sw:function(e,d,c){return b.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,d,c]))},ne:function(e,d,c){return b.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,d,c]))},nw:function(e,d,c){return b.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,d,c]))}},_propagate:function(d,c){b.ui.plugin.call(this,d,[c,this.ui()]);(d!="resize"&&this._trigger(d,c,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));b.extend(b.ui.resizable,{version:"1.6rc6",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,disableSelection:true,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,preserveCursor:true,preventDefault:true,proportionallyResize:false,transparent:false,zIndex:1000}});b.ui.plugin.add("resizable","alsoResize",{start:function(d,e){var c=b(this).data("resizable"),f=c.options;_store=function(g){b(g).each(function(){b(this).data("resizable-alsoresize",{width:parseInt(b(this).width(),10),height:parseInt(b(this).height(),10),left:parseInt(b(this).css("left"),10),top:parseInt(b(this).css("top"),10)})})};if(typeof(f.alsoResize)=="object"&&!f.alsoResize.parentNode){if(f.alsoResize.length){f.alsoResize=f.alsoResize[0];_store(f.alsoResize)}else{b.each(f.alsoResize,function(g,h){_store(g)})}}else{_store(f.alsoResize)}},resize:function(e,g){var d=b(this).data("resizable"),h=d.options,f=d.originalSize,j=d.originalPosition;var i={height:(d.size.height-f.height)||0,width:(d.size.width-f.width)||0,top:(d.position.top-j.top)||0,left:(d.position.left-j.left)||0},c=function(k,l){b(k).each(function(){var o=b(this),p=b(this).data("resizable-alsoresize"),n={},m=l&&l.length?l:["width","height","top","left"];b.each(m||["width","height","top","left"],function(q,s){var r=(p[s]||0)+(i[s]||0);if(r&&r>=0){n[s]=r||null}});if(/relative/.test(o.css("position"))&&b.browser.opera){d._revertToRelativePosition=true;o.css({position:"absolute",top:"auto",left:"auto"})}o.css(n)})};if(typeof(h.alsoResize)=="object"&&!h.alsoResize.nodeType){b.each(h.alsoResize,function(k,l){c(k,l)})}else{c(h.alsoResize)}},stop:function(d,e){var c=b(this).data("resizable");if(c._revertToRelativePosition&&b.browser.opera){c._revertToRelativePosition=false;el.css({position:"relative"})}b(this).removeData("resizable-alsoresize-start")}});b.ui.plugin.add("resizable","animate",{stop:function(g,l){var m=b(this).data("resizable"),h=m.options;var f=h.proportionallyResize,c=f&&(/textarea/i).test(f.get(0).nodeName),d=c&&b.ui.hasScroll(f.get(0),"left")?0:m.sizeDiff.height,j=c?0:m.sizeDiff.width;var e={width:(m.size.width-j),height:(m.size.height-d)},i=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,k=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;m.element.animate(b.extend(e,k&&i?{top:k,left:i}:{}),{duration:h.animateDuration,easing:h.animateEasing,step:function(){var n={width:parseInt(m.element.css("width"),10),height:parseInt(m.element.css("height"),10),top:parseInt(m.element.css("top"),10),left:parseInt(m.element.css("left"),10)};if(f){f.css({width:n.width,height:n.height})}m._updateCache(n);m._propagate("resize",g)}})}});b.ui.plugin.add("resizable","containment",{start:function(d,n){var r=b(this).data("resizable"),h=r.options,j=r.element;var e=h.containment,i=(e instanceof b)?e.get(0):(/parent/.test(e))?j.parent().get(0):e;if(!i){return}r.containerElement=b(i);if(/document/.test(e)||e==document){r.containerOffset={left:0,top:0};r.containerPosition={left:0,top:0};r.parentData={element:b(document),left:0,top:0,width:b(document).width(),height:b(document).height()||document.body.parentNode.scrollHeight}}else{var l=b(i),g=[];b(["Top","Right","Left","Bottom"]).each(function(p,o){g[p]=a(l.css("padding"+o))});r.containerOffset=l.offset();r.containerPosition=l.position();r.containerSize={height:(l.innerHeight()-g[3]),width:(l.innerWidth()-g[1])};var m=r.containerOffset,c=r.containerSize.height,k=r.containerSize.width,f=(b.ui.hasScroll(i,"left")?i.scrollWidth:k),q=(b.ui.hasScroll(i)?i.scrollHeight:c);r.parentData={element:i,left:m.left,top:m.top,width:f,height:q}}},resize:function(e,l){var p=b(this).data("resizable"),g=p.options,d=p.containerSize,k=p.containerOffset,i=p.size,j=p.position,m=g._aspectRatio||e.shiftKey,c={top:0,left:0},f=p.containerElement;if(f[0]!=document&&(/static/).test(f.css("position"))){c=k}if(j.left<(p._helper?k.left:0)){p.size.width=p.size.width+(p._helper?(p.position.left-k.left):(p.position.left-c.left));if(m){p.size.height=p.size.width/g.aspectRatio}p.position.left=g.helper?k.left:0}if(j.top<(p._helper?k.top:0)){p.size.height=p.size.height+(p._helper?(p.position.top-k.top):p.position.top);if(m){p.size.width=p.size.height*g.aspectRatio}p.position.top=p._helper?k.top:0}var h=Math.abs((p._helper?p.offset.left-c.left:(p.offset.left-c.left))+p.sizeDiff.width),n=Math.abs((p._helper?p.offset.top-c.top:(p.offset.top-k.top))+p.sizeDiff.height);if(h+p.size.width>=p.parentData.width){p.size.width=p.parentData.width-h;if(m){p.size.height=p.size.width/g.aspectRatio}}if(n+p.size.height>=p.parentData.height){p.size.height=p.parentData.height-n;if(m){p.size.width=p.size.height*g.aspectRatio}}},stop:function(d,l){var n=b(this).data("resizable"),e=n.options,j=n.position,k=n.containerOffset,c=n.containerPosition,f=n.containerElement;var g=b(n.helper),p=g.offset(),m=g.outerWidth()-n.sizeDiff.width,i=g.outerHeight()-n.sizeDiff.height;if(n._helper&&!e.animate&&(/relative/).test(f.css("position"))){b(this).css({left:p.left-c.left-k.left,width:m,height:i})}if(n._helper&&!e.animate&&(/static/).test(f.css("position"))){b(this).css({left:p.left-c.left-k.left,width:m,height:i})}}});b.ui.plugin.add("resizable","ghost",{start:function(e,f){var c=b(this).data("resizable"),g=c.options,h=g.proportionallyResize,d=c.size;c.ghost=c.originalElement.clone();c.ghost.css({opacity:0.25,display:"block",position:"relative",height:d.height,width:d.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof g.ghost=="string"?g.ghost:"");c.ghost.appendTo(c.helper)},resize:function(d,e){var c=b(this).data("resizable"),f=c.options;if(c.ghost){c.ghost.css({position:"relative",height:c.size.height,width:c.size.width})}},stop:function(d,e){var c=b(this).data("resizable"),f=c.options;if(c.ghost&&c.helper){c.helper.get(0).removeChild(c.ghost.get(0))}}});b.ui.plugin.add("resizable","grid",{resize:function(c,k){var m=b(this).data("resizable"),f=m.options,i=m.size,g=m.originalSize,h=m.originalPosition,l=m.axis,j=f._aspectRatio||c.shiftKey;f.grid=typeof f.grid=="number"?[f.grid,f.grid]:f.grid;var e=Math.round((i.width-g.width)/(f.grid[0]||1))*(f.grid[0]||1),d=Math.round((i.height-g.height)/(f.grid[1]||1))*(f.grid[1]||1);if(/^(se|s|e)$/.test(l)){m.size.width=g.width+e;m.size.height=g.height+d}else{if(/^(ne)$/.test(l)){m.size.width=g.width+e;m.size.height=g.height+d;m.position.top=h.top-d}else{if(/^(sw)$/.test(l)){m.size.width=g.width+e;m.size.height=g.height+d;m.position.left=h.left-e}else{m.size.width=g.width+e;m.size.height=g.height+d;m.position.top=h.top-d;m.position.left=h.left-e}}}}});var a=function(c){return parseInt(c,10)||0}})(jQuery);/* + * jQuery UI Selectable 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.selectable",a.extend({},a.ui.mouse,{_init:function(){var b=this;this.element.addClass("ui-selectable");this.dragged=false;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]);c.each(function(){var d=a(this);var e=d.offset();a.data(this,"selectable-item",{element:this,$element:d,left:e.left,top:e.top,right:e.left+d.outerWidth(),bottom:e.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=a(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy()},_mouseStart:function(d){var b=this;this.opos=[d.pageX,d.pageY];if(this.options.disabled){return}var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",d);a("body").append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});if(c.autoRefresh){this.refresh()}this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!d.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting=true;b._trigger("unselecting",d,{unselecting:e.element})}});a(d.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){e.$element.removeClass("ui-unselecting").addClass("ui-selecting");e.unselecting=false;e.selecting=true;e.selected=true;b._trigger("selecting",d,{selecting:e.element});return false}})},_mouseDrag:function(i){var c=this;this.dragged=true;if(this.options.disabled){return}var e=this.options;var d=this.opos[0],h=this.opos[1],b=i.pageX,g=i.pageY;if(d>b){var f=b;b=d;d=f}if(h>g){var f=g;g=h;h=f}this.helper.css({left:d,top:h,width:b-d,height:g-h});this.selectees.each(function(){var j=a.data(this,"selectable-item");if(!j||j.element==c.element[0]){return}var k=false;if(e.tolerance=="touch"){k=(!(j.left>b||j.rightg||j.bottomd&&j.righth&&j.bottom=0;b--){this.items[b].item.removeData("sortable-item")}},_mouseCapture:function(e,f){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(e);var d=null,c=this,b=a(e.target).parents().each(function(){if(a.data(this,"sortable-item")==c){d=a(this);return false}});if(a.data(e.target,"sortable-item")==c){d=a(e.target)}if(!d){return false}if(this.options.handle&&!f){var g=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==e.target){g=true}});if(!g){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,b){var g=this.options,c=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(e);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(e);this.originalPageX=e.pageX;this.originalPageY=e.pageY;if(g.cursorAt){this._adjustOffsetFromHelper(g.cursorAt)}this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!b){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,c._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass(g.cssNamespace+"-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(f){this.position=this._generatePosition(f);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var g=this.options,b=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-f.pageY=0;d--){var e=this.items[d],c=e.item[0],h=this._intersectsWithPointer(e);if(!h){continue}if(c!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=c&&!a.ui.contains(this.placeholder[0],c)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],c):true)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e)){this.options.sortIndicator.call(this,f,e)}else{break}this._trigger("change",f,this._uiHash());break}}this._contactContainers(f);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,f)}this._trigger("sort",f,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(c,d){if(!c){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,c)}if(this.options.revert){var b=this;var e=b.placeholder.offset();b.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-b.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-b.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){b._clear(c)})}else{this._clear(c,d)}return false},cancel:function(){var b=this;if(this.dragging){this._mouseUp();if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass(this.options.cssNamespace+"-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,b._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,b._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}return true},serialize:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};a(b).each(function(){var e=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||(/(.+)[-=_](.+)/));if(e){c.push((d.key||e[1]+"[]")+"="+(d.key&&d.expression?e[1]:e[2]))}});return c.join("&")},toArray:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};b.each(function(){c.push(a(d.item||this).attr(d.attribute||"id")||"")});return c},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)f&&(e+h)m[this.floating?"width":"height"])){return g}else{return(f0?"down":"up")},_getDragHorizontalDirection:function(){var b=this.positionAbs.left-this.lastPositionAbs.left;return b!=0&&(b>0?"right":"left")},refresh:function(b){this._refreshItems(b);this.refreshPositions()},_getItemsAsjQuery:function(b){var l=this;var g=[];var e=[];if(this.options.connectWith&&b){var h=this.options.connectWith.constructor==String?[this.options.connectWith]:this.options.connectWith;for(var d=h.length-1;d>=0;d--){var k=a(h[d]);for(var c=k.length-1;c>=0;c--){var f=a.data(k[c],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element):a(f.options.items,f.element).not("."+f.options.cssNamespace+"-sortable-helper"),f])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not("."+this.options.cssNamespace+"-sortable-helper"),this]);for(var d=e.length-1;d>=0;d--){e[d][0].each(function(){g.push(this)})}return a(g)},_removeCurrentsFromItems:function(){var d=this.currentItem.find(":data(sortable-item)");for(var c=0;c=0;e--){var l=a(this.options.connectWith[e]);for(var d=l.length-1;d>=0;d--){var g=a.data(l[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element[0],b,{item:this.currentItem}):a(g.options.items,g.element),g]);this.containers.push(g)}}}}for(var e=f.length-1;e>=0;e--){var k=f[e][1];var c=f[e][0];for(var d=0,m=c.length;d=0;d--){var e=this.items[d];if(e.instance!=this.currentContainer&&this.currentContainer&&e.item[0]!=this.currentItem[0]){continue}var c=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!b){if(this.options.accurateIntersection){e.width=c.outerWidth();e.height=c.outerHeight()}else{e.width=c[0].offsetWidth;e.height=c[0].offsetHeight}}var f=c.offset();e.left=f.left;e.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var d=this.containers.length-1;d>=0;d--){var f=this.containers[d].element.offset();this.containers[d].containerCache.left=f.left;this.containers[d].containerCache.top=f.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}}},_createPlaceholder:function(d){var b=d||this,e=b.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(b.currentItem[0].nodeName)).addClass(c||b.currentItem[0].className+" "+b.options.cssNamespace+"-sortable-placeholder").removeClass(b.options.cssNamespace+"-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=a(e.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);e.placeholder.update(b,b.placeholder)},_contactContainers:function(d){for(var c=this.containers.length-1;c>=0;c--){if(this._intersectsWith(this.containers[c].containerCache)){if(!this.containers[c].containerCache.over){if(this.currentContainer!=this.containers[c]){var h=10000;var g=null;var e=this.positionAbs[this.containers[c].floating?"left":"top"];for(var b=this.items.length-1;b>=0;b--){if(!a.ui.contains(this.containers[c].element[0],this.items[b].item[0])){continue}var f=this.items[b][this.containers[c].floating?"left":"top"];if(Math.abs(f-e)this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left=0;c--){if(a.ui.contains(this.containers[c].element[0],this.currentItem[0])&&!e){f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.containers[c]));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.containers[c]))}}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedCursor)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c *",placeholder:false,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,sortIndicator:a.ui.sortable.prototype._rearrange,tolerance:"intersect",zIndex:1000}})})(jQuery);/* + * jQuery UI Accordion 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.accordion",{_init:function(){var d=this.options,b=this;this.running=0;if(d.navigation){var c=this.element.find("a").filter(d.navigationFilter);if(c.length){if(c.filter(d.header).length){this.active=c}else{this.active=c.parent().parent().prev();c.addClass("ui-accordion-content-active")}}}this.element.addClass("ui-accordion ui-widget ui-helper-reset");this.headers=this.element.find(d.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){a(this).removeClass("ui-state-hover")});this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");this.active=this._findActive(this.active||d.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active");a("").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.find(".ui-icon").toggleClass(d.icons.header).toggleClass(d.icons.headerSelected);if(a.browser.msie){this.element.find("a").css("zoom","1")}this.resize();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown",function(e){return b._keydown(e)}).next().attr("role","tabpanel");this.headers.not(this.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();if(!this.active.length){this.headers.eq(0).attr("tabIndex","0")}else{this.active.attr("aria-expanded","true").attr("tabIndex","0")}if(!a.browser.safari){this.headers.find("a").attr("tabIndex","-1")}if(d.event){this.element.bind((d.event)+".accordion",function(e){return b._clickHandler.call(b,e)})}},destroy:function(){this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role").unbind(".accordion").removeData("accordion");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex");this.headers.find("a").removeAttr("tabindex");this.headers.children(".ui-icon").remove();this.headers.next().removeClass("ui-accordion-content ui-accordion-content-active")},_keydown:function(e){var g=this.options,f=a.ui.keyCode;if(g.disabled||e.altKey||e.ctrlKey){return}var d=this.headers.length;var b=this.headers.index(e.target);var c=false;switch(e.keyCode){case f.RIGHT:case f.DOWN:c=this.headers[(b+1)%d];break;case f.LEFT:case f.UP:c=this.headers[(b-1+d)%d];break;case f.SPACE:case f.ENTER:return this._clickHandler({target:e.target})}if(c){a(e.target).attr("tabIndex","-1");a(c).attr("tabIndex","0");c.focus();return false}return true},resize:function(){var e=this.options,d;if(e.fillSpace){if(a.browser.msie){var b=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}d=this.element.parent().height();if(a.browser.msie){this.element.parent().css("overflow",b)}this.headers.each(function(){d-=a(this).outerHeight()});var c=0;this.headers.next().each(function(){c=Math.max(c,a(this).innerHeight()-a(this).height())}).height(d-c).css("overflow","auto")}else{if(e.autoHeight){d=0;this.headers.next().each(function(){d=Math.max(d,a(this).outerHeight())}).height(d)}}},activate:function(b){this._clickHandler({target:this._findActive(b)[0]})},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===false?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(f){var h=this.options;if(h.disabled){return false}if(!f.target&&!h.alwaysOpen){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(h.icons.headerSelected).addClass(h.icons.header);this.active.next().addClass("ui-accordion-content-active");var c=this.active.next(),g={options:h,newHeader:a([]),oldHeader:h.active,newContent:a([]),oldContent:c},b=(this.active=a([]));this._toggle(b,c,g);return false}var d=a(f.target);d=a(d.parents(h.header)[0]||d);var e=d[0]==this.active[0];if(this.running||(h.alwaysOpen&&e)){return false}if(!d.is(h.header)){return}this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(h.icons.headerSelected).addClass(h.icons.header);this.active.next().addClass("ui-accordion-content-active");if(!e){d.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").find(".ui-icon").removeClass(h.icons.header).addClass(h.icons.headerSelected);d.next().addClass("ui-accordion-content-active")}var b=d.next(),c=this.active.next(),g={options:h,newHeader:e&&!h.alwaysOpen?a([]):d,oldHeader:this.active,newContent:e&&!h.alwaysOpen?a([]):b.find("> *"),oldContent:c.find("> *")},i=this.headers.index(this.active[0])>this.headers.index(d[0]);this.active=e?a([]):d;this._toggle(b,c,g,e,i);return false},_toggle:function(b,i,g,j,k){var d=this.options,m=this;this.toShow=b;this.toHide=i;this.data=g;var c=function(){if(!m){return}return m._completed.apply(m,arguments)};this._trigger("changestart",null,this.data);this.running=i.size()===0?b.size():i.size();if(d.animated){var f={};if(!d.alwaysOpen&&j){f={toShow:a([]),toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}else{f={toShow:b,toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}if(!d.proxied){d.proxied=d.animated}if(!d.proxiedDuration){d.proxiedDuration=d.duration}d.animated=a.isFunction(d.proxied)?d.proxied(f):d.proxied;d.duration=a.isFunction(d.proxiedDuration)?d.proxiedDuration(f):d.proxiedDuration;var l=a.ui.accordion.animations,e=d.duration,h=d.animated;if(!l[h]){l[h]=function(n){this.slide(n,{easing:h,duration:e||700})}}l[h](f)}else{if(!d.alwaysOpen&&j){b.toggle()}else{i.hide();b.show()}c(true)}i.prev().attr("aria-expanded","false").attr("tabIndex","-1");b.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()},_completed:function(b){var c=this.options;this.running=b?0:--this.running;if(this.running){return}if(c.clearStyle){this.toShow.add(this.toHide).css({height:"",overflow:""})}this._trigger("change",null,this.data)}});a.extend(a.ui.accordion,{version:"1.6rc6",defaults:{active:null,autoHeight:true,alwaysOpen:true,animated:"slide",clearStyle:false,event:"click",fillSpace:false,header:"a",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},animations:{slide:function(j,h){j=a.extend({easing:"swing",duration:300},j,h);if(!j.toHide.size()){j.toShow.animate({height:"show"},j);return}var b=j.toHide.height(),i=j.toShow.height(),c=i/b,d=j.toShow.css("overflow"),e={},g={},f=["height","paddingTop","paddingBottom"];a.each(f,function(k,l){g[l]="hide";e[l]=parseFloat(j.toShow.css(l))});j.toShow.css({height:0,overflow:"hidden"}).show();j.toHide.filter(":hidden").each(j.complete).end().filter(":visible").animate(g,{step:function(l,m){if(!j.toShow[0]){return}var k=m.start!=m.end?(m.now-m.start)/(m.end-m.start):0,n=k*e[m.prop];if(a.browser.msie||a.browser.opera){n=Math.ceil(n)}j.toShow[0].style[m.prop]=n+"px"},duration:j.duration,easing:j.easing,complete:function(){if(!j.autoHeight){j.toShow.css("height","auto")}j.toShow.css({overflow:d});j.complete()}})},bounceslide:function(b){this.slide(b,{easing:b.down?"easeOutBounce":"swing",duration:b.down?1000:200})},easeslide:function(b){this.slide(b,{easing:"easeinout",duration:700})}}})})(jQuery);/* + * jQuery UI Dialog 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * ui.core.js + * ui.draggable.js + * ui.resizable.js + */ +(function(b){var a={dragStart:"start.draggable",drag:"drag.draggable",dragStop:"stop.draggable",maxHeight:"maxHeight.resizable",minHeight:"minHeight.resizable",maxWidth:"maxWidth.resizable",minWidth:"minWidth.resizable",resizeStart:"start.resizable",resize:"drag.resizable",resizeStop:"stop.resizable"};b.widget("ui.dialog",{_init:function(){this.originalTitle=this.element.attr("title");var k=this,l=this.options,i=l.title||this.originalTitle||" ",d=b.ui.dialog.getTitleId(this.element),j=(this.uiDialog=b("
")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+l.dialogClass).css({position:"absolute",overflow:"hidden",zIndex:l.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(m){(l.closeOnEscape&&m.keyCode&&m.keyCode==b.ui.keyCode.ESCAPE&&k.close(m))}).attr({role:"dialog","aria-labelledby":d}).mousedown(function(m){k.moveToTop(m)}),f=this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(j),e=(this.uiDialogTitlebar=b("
")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(j),h=b('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).mousedown(function(m){m.stopPropagation()}).click(function(m){k.close(m);return false}).appendTo(e),g=(this.uiDialogTitlebarCloseText=b("")).addClass("ui-icon ui-icon-closethick").text(l.closeText).appendTo(h),c=b("").addClass("ui-dialog-title").attr("id",d).html(i).prependTo(e);e.find("*").add(e).disableSelection();(l.draggable&&b.fn.draggable&&this._makeDraggable());(l.resizable&&b.fn.resizable&&this._makeResizable());this._createButtons(l.buttons);this._isOpen=false;(l.bgiframe&&b.fn.bgiframe&&j.bgiframe());(l.autoOpen&&this.open())},destroy:function(){(this.overlay&&this.overlay.destroy());(this.shadow&&this._destroyShadow());this.uiDialog.hide();this.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");this.uiDialog.remove();(this.originalTitle&&this.element.attr("title",this.originalTitle))},close:function(c){if(false===this._trigger("beforeclose",c)){return}(this.overlay&&this.overlay.destroy());(this.shadow&&this._destroyShadow());this.uiDialog.hide(this.options.hide).unbind("keypress.ui-dialog");this._trigger("close",c);b.ui.dialog.overlay.resize();this._isOpen=false},isOpen:function(){return this._isOpen},moveToTop:function(g,f){if((this.options.modal&&!g)||(!this.options.stack&&!this.options.modal)){return this._trigger("focus",f)}var e=this.options.zIndex,d=this.options;b(".ui-dialog:visible").each(function(){e=Math.max(e,parseInt(b(this).css("z-index"),10)||d.zIndex)});(this.overlay&&this.overlay.$el.css("z-index",++e));(this.shadow&&this.shadow.css("z-index",++e));var c={scrollTop:this.element.attr("scrollTop"),scrollLeft:this.element.attr("scrollLeft")};this.uiDialog.css("z-index",++e);this.element.attr(c);this._trigger("focus",f)},open:function(e){if(this._isOpen){return}var d=this.options,c=this.uiDialog;this.overlay=d.modal?new b.ui.dialog.overlay(this):null;(c.next().length&&c.appendTo("body"));this._size();this._position(d.position);c.show(d.show);this.moveToTop(true,e);(d.modal&&c.bind("keypress.ui-dialog",function(h){if(h.keyCode!=b.ui.keyCode.TAB){return}var g=b(":tabbable",this),i=g.filter(":first")[0],f=g.filter(":last")[0];if(h.target==f&&!h.shiftKey){setTimeout(function(){i.focus()},1)}else{if(h.target==i&&h.shiftKey){setTimeout(function(){f.focus()},1)}}}));b([]).add(c.find(".ui-dialog-content :tabbable:first")).add(c.find(".ui-dialog-buttonpane :tabbable:first")).add(c.find(".ui-dialog-titlebar :tabbable:first")).filter(":first").focus();if(d.shadow){this._createShadow()}this._trigger("open",e);this._isOpen=true},_createButtons:function(f){var e=this,c=false,d=b("
").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");this.uiDialog.find(".ui-dialog-buttonpane").remove();(typeof f=="object"&&f!==null&&b.each(f,function(){return !(c=true)}));if(c){b.each(f,function(g,h){b('').addClass("ui-state-default ui-corner-all").text(g).click(function(){h.apply(e.element[0],arguments)}).hover(function(){b(this).addClass("ui-state-hover")},function(){b(this).removeClass("ui-state-hover")}).focus(function(){b(this).addClass("ui-state-focus")}).blur(function(){b(this).removeClass("ui-state-focus")}).appendTo(d)});d.appendTo(this.uiDialog)}},_makeDraggable:function(){var c=this,d=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content",helper:d.dragHelper,handle:".ui-dialog-titlebar",containment:"document",start:function(){(d.dragStart&&d.dragStart.apply(c.element[0],arguments));if(b.browser.msie&&b.browser.version<7&&c.shadow){c.shadow.hide()}},drag:function(){(d.drag&&d.drag.apply(c.element[0],arguments));c._refreshShadow(1)},stop:function(){(d.dragStop&&d.dragStop.apply(c.element[0],arguments));b.ui.dialog.overlay.resize();if(b.browser.msie&&b.browser.version<7&&c.shadow){c.shadow.show()}c._refreshShadow()}})},_makeResizable:function(f){f=(f===undefined?this.options.resizable:f);var c=this,e=this.options,d=typeof f=="string"?f:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",alsoResize:this.element,helper:e.resizeHelper,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:e.minHeight,start:function(){(e.resizeStart&&e.resizeStart.apply(c.element[0],arguments));if(b.browser.msie&&b.browser.version<7&&c.shadow){c.shadow.hide()}},resize:function(){(e.resize&&e.resize.apply(c.element[0],arguments));c._refreshShadow(1)},handles:d,stop:function(){(e.resizeStop&&e.resizeStop.apply(c.element[0],arguments));b.ui.dialog.overlay.resize();if(b.browser.msie&&b.browser.version<7&&c.shadow){c.shadow.show()}c._refreshShadow()}}).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_position:function(h){var d=b(window),e=b(document),f=e.scrollTop(),c=e.scrollLeft(),g=f;if(b.inArray(h,["center","top","right","bottom","left"])>=0){h=[h=="right"||h=="left"?h:"center",h=="top"||h=="bottom"?h:"middle"]}if(h.constructor!=Array){h=["center","middle"]}if(h[0].constructor==Number){c+=h[0]}else{switch(h[0]){case"left":c+=0;break;case"right":c+=d.width()-this.uiDialog.outerWidth();break;default:case"center":c+=(d.width()-this.uiDialog.outerWidth())/2}}if(h[1].constructor==Number){f+=h[1]}else{switch(h[1]){case"top":f+=0;break;case"bottom":f+=d.height()-this.uiDialog.outerHeight();break;default:case"middle":f+=(d.height()-this.uiDialog.outerHeight())/2}}f=Math.max(f,g);this.uiDialog.css({top:f,left:c})},_setData:function(d,e){(a[d]&&this.uiDialog.data(a[d],e));switch(d){case"buttons":this._createButtons(e);break;case"closeText":this.uiDialogTitlebarCloseText.text(e);break;case"draggable":(e?this._makeDraggable():this.uiDialog.draggable("destroy"));break;case"height":this.uiDialog.height(e);break;case"position":this._position(e);break;case"resizable":var c=this.uiDialog,f=this.uiDialog.is(":data(resizable)");(f&&!e&&c.resizable("destroy"));(f&&typeof e=="string"&&c.resizable("option","handles",e));(f||this._makeResizable(e));break;case"title":b(".ui-dialog-title",this.uiDialogTitlebar).html(e||" ");break;case"width":this.uiDialog.width(e);break}b.widget.prototype._setData.apply(this,arguments)},_size:function(){var d=this.options;this.element.css({height:0,minHeight:0,width:"auto"});var c=this.uiDialog.css({height:"auto",width:d.width}).height();this.element.css({minHeight:Math.max(d.minHeight-c,0),height:d.height=="auto"?"auto":d.height-c})},_createShadow:function(){this.shadow=b('
').css("position","absolute").appendTo(document.body);this._refreshShadow();return this.shadow},_refreshShadow:function(c){if(c&&b.browser.msie&&b.browser.version<7){return}var d=this.uiDialog.offset();this.shadow.css({left:d.left,top:d.top,width:this.uiDialog.outerWidth(),height:this.uiDialog.outerHeight()})},_destroyShadow:function(){this.shadow.remove();this.shadow=null}});b.extend(b.ui.dialog,{version:"1.6rc6",defaults:{autoOpen:true,bgiframe:false,buttons:{},closeOnEscape:true,closeText:"close",draggable:true,height:"auto",minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,shadow:true,stack:true,title:"",width:300,zIndex:1000},getter:"isOpen",uuid:0,getTitleId:function(c){return"ui-dialog-title-"+(c.attr("id")||++this.uuid)},overlay:function(c){this.$el=b.ui.dialog.overlay.create(c)}});b.extend(b.ui.dialog.overlay,{instances:[],events:b.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(c){return c+".dialog-overlay"}).join(" "),create:function(d){if(this.instances.length===0){setTimeout(function(){b("a, :input").bind(b.ui.dialog.overlay.events,function(){var f=false;var h=b(this).parents(".ui-dialog");if(h.length){var e=b(".ui-dialog-overlay");if(e.length){var g=parseInt(e.css("z-index"),10);e.each(function(){g=Math.max(g,parseInt(b(this).css("z-index"),10))});f=parseInt(h.css("z-index"),10)>g}else{f=true}}return f})},1);b(document).bind("keydown.dialog-overlay",function(e){(d.options.closeOnEscape&&e.keyCode&&e.keyCode==b.ui.keyCode.ESCAPE&&d.close(e))});b(window).bind("resize.dialog-overlay",b.ui.dialog.overlay.resize)}var c=b("
").appendTo(document.body).addClass("ui-widget-overlay").css({width:this.width(),height:this.height()});(d.options.bgiframe&&b.fn.bgiframe&&c.bgiframe());this.instances.push(c);return c},destroy:function(c){this.instances.splice(b.inArray(this.instances,c),1);if(this.instances.length===0){b("a, :input").add([document,window]).unbind(".dialog-overlay")}c.remove()},height:function(){if(b.browser.msie&&b.browser.version<7){var d=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);var c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);if(d
");if(!c.values){c.values=[this._valueMin(),this._valueMin()]}if(c.values.length&&c.values.length!=2){c.values=[c.values[0],c.values[0]]}}else{this.range=a("
")}this.range.appendTo(this.element).addClass("ui-slider-range ui-widget-header");(c.range=="min")&&(this.orientation=="horizontal")&&this.range.css({left:0});(c.range=="max")&&(this.orientation=="horizontal")&&this.range.css({right:0});(c.range=="min")&&(this.orientation=="vertical")&&this.range.css({bottom:0});(c.range=="max")&&(this.orientation=="vertical")&&this.range.css({top:0})}if(a(".ui-slider-handle",this.element).length==0){a('
').appendTo(this.element).addClass("ui-slider-handle")}if(c.values&&c.values.length){while(a(".ui-slider-handle",this.element).length').appendTo(this.element).addClass("ui-slider-handle")}}this.handles=a(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(d){d.preventDefault()}).hover(function(){a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){b.handles.removeClass("ui-state-focus");a(this).addClass("ui-state-focus")}).blur(function(){a(this).removeClass("ui-state-focus")});this.handles.each(function(d){a(this).data("index.ui-slider-handle",d)});this.handles.keydown(function(h){var e=a(this).data("index.ui-slider-handle");if(b.options.disabled){return}switch(h.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(!b._keySliding){b._keySliding=true;a(this).addClass("ui-state-active");b._start(h)}break}var f,d,g=b._step();if(b.options.values&&b.options.values.length){f=d=b.values(e)}else{f=d=b.value()}switch(h.keyCode){case a.ui.keyCode.HOME:d=b._valueMin();break;case a.ui.keyCode.END:d=b._valueMax();break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(f==b._valueMax()){return}d=f+g;break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(f==b._valueMin()){return}d=f-g;break}b._slide(h,e,d)}).keyup(function(d){if(b._keySliding){b._stop(d);b._change(d);b._keySliding=false;a(this).removeClass("ui-state-active")}});this._refreshValue()},destroy:function(){this.handles.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy()},_mouseCapture:function(d){var e=this.options;if(e.disabled){return false}this._start(d);this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();var h={x:d.pageX,y:d.pageY};var j=this._normValueFromMouse(h);var c=this._valueMax()+1,f;var k=this,i;this.handles.each(function(l){var m=Math.abs(j-k.values(l));if(c>m){c=m;f=a(this);i=l}});if(e.range&&(this.values(0)+this.values(1))==0){f=a(this.handles[++i])}k._handleIndex=i;f.addClass("ui-state-active").focus();var g=f.offset();var b=!a(d.target).parents().andSelf().is(".ui-slider-handle");this._clickOffset=b?{left:0,top:0}:{left:d.pageX-g.left+(parseInt(f.css("marginLeft"),10)||0),top:d.pageY-g.top+(parseInt(f.css("marginTop"),10)||0)};j=this._normValueFromMouse(h);this._slide(d,i,j);return true},_mouseStart:function(b){return true},_mouseDrag:function(d){var b={x:d.pageX,y:d.pageY};var c=this._normValueFromMouse(b);this._slide(d,this._handleIndex,c);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._stop(b);this._change(b);this._handleIndex=null;this._clickOffset=null;return false},_detectOrientation:function(){this.orientation=this.options.orientation=="auto"?(this.element[0].offsetWidth/this.element[0].offsetHeight>1?"horizontal":"vertical"):this.options.orientation},_normValueFromMouse:function(d){var c,h;if("horizontal"==this.orientation){c=this.elementSize.width;h=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{c=this.elementSize.height;h=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}var f=(h/c);if(f>1){f=1}if(f<0){f=0}if("vertical"==this.orientation){f=1-f}var e=this._valueMax()-this._valueMin(),i=f*e,b=i%this.options.step,g=this._valueMin()+i-b;if(b>(this.options.step/2)){g+=this.options.step}return g},_start:function(b){this._trigger("start",b,{value:this.value()})},_slide:function(f,e,d){var g=this.handles[e];if(this.options.values&&this.options.values.length){var b=this.values(e?0:1);if((e==0&&d>=b)||(e==1&&d<=b)){d=b}if(d!=this.values(e)){var c=this.values();c[e]=d;var h=this._trigger("slide",f,{handle:g,value:d,values:c});var b=this.values(e?0:1);if(h!==false){this.values(e,d,!(f.type=="mousedown"&&this.options.animate))}}}else{if(d!=this.value()){var h=this._trigger("slide",f,{handle:g,value:d});if(h!==false){this._setData("value",d,(f.type=="mousedown"&&this.options.animate))}}}},_stop:function(b){this._trigger("stop",b,{value:this.value()})},_change:function(b){this._trigger("change",b,{value:this.value()})},value:function(b){if(arguments.length){this._setData("value",b);this._change()}return this._value()},values:function(c,d,b){if(!this.options.animate){b=true}if(arguments.length>1){this.options.values[c]=d;this._refreshValue(!b);this._change()}if(arguments.length){if(this.options.values&&this.options.values.length){return this._values(c)}else{return this.value()}}else{return this._values()}},_setData:function(b,c){a.widget.prototype._setData.apply(this,arguments);switch(b){case"orientation":this._detectOrientation();this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case"value":this._refreshValue();break}},_step:function(){var b=this.options.step;return b},_value:function(){var b=this.options.value;if(bthis._valueMax()){b=this._valueMax()}return b},_values:function(b){if(arguments.length){var c=this.options.values[b];if(cthis._valueMax()){c=this._valueMax()}return c}else{return this.options.values}},_valueMin:function(){var b=this.options.min;return b},_valueMax:function(){var b=this.options.max;return b},_refreshValue:function(e){var h=this.options.range,g=this.options,d=this;if(this.options.values&&this.options.values.length){var c,i;this.handles.each(function(n,l){var m=(d.values(n)-d._valueMin())/(d._valueMax()-d._valueMin())*100;var k={};k[d.orientation=="horizontal"?"left":"bottom"]=m+"%";a(this).stop(1,1)[e?"animate":"css"](k,g.animate);if(d.options.range===true){if(d.orientation=="horizontal"){(n==0)&&d.range.stop(1,1)[e?"animate":"css"]({left:m+"%"},g.animate);(n==1)&&d.range[e?"animate":"css"]({width:(m-lastValPercent)+"%"},{queue:false,duration:g.animate})}else{(n==0)&&d.range.stop(1,1)[e?"animate":"css"]({bottom:(m)+"%"},g.animate);(n==1)&&d.range[e?"animate":"css"]({height:(m-lastValPercent)+"%"},{queue:false,duration:g.animate})}}lastValPercent=m})}else{var f=(this.value()-this._valueMin())/(this._valueMax()-this._valueMin())*100;var b={};b[d.orientation=="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](b,g.animate);(h=="min")&&(this.orientation=="horizontal")&&this.range.stop(1,1)[e?"animate":"css"]({left:0,width:f+"%"},g.animate);(h=="max")&&(this.orientation=="horizontal")&&this.range[e?"animate":"css"]({left:f+"%",width:(100-f)+"%"},{queue:false,duration:g.animate});(h=="min")&&(this.orientation=="vertical")&&this.range.stop(1,1)[e?"animate":"css"]({top:(100-f)+"%",height:f+"%"},g.animate);(h=="max")&&(this.orientation=="vertical")&&this.range[e?"animate":"css"]({bottom:f+"%",height:(100-f)+"%"},{queue:false,duration:g.animate})}}}));a.extend(a.ui.slider,{getter:"value values",version:"1.6rc6",eventPrefix:"slide",defaults:{animate:false,delay:0,distance:0,max:100,min:0,orientation:"auto",range:false,step:1,value:0,values:null}})})(jQuery);/* + * jQuery UI Tabs 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.tabs",{_init:function(){this._tabify(true)},_setData:function(b,c){if((/^selected/).test(b)){this.select(c)}else{this.options[b]=c;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+a.data(b)},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+a.data(this.list[0]));return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(c,b){return{tab:c,panel:b,index:this.$tabs.index(c)}},_tabify:function(q){this.list=this.element.is("div")?this.element.children("ul:first, ol:first").eq(0):this.element;this.$lis=a("li:has(a[href])",this.list);this.$tabs=this.$lis.map(function(){return a("a",this)[0]});this.$panels=a([]);var r=this,d=this.options;var c=/^#.+/;this.$tabs.each(function(t,o){var s=a(o).attr("href");if(c.test(s)){r.$panels=r.$panels.add(r._sanitizeSelector(s))}else{if(s!="#"){a.data(o,"href.tabs",s);a.data(o,"load.tabs",s.replace(/#.*$/,""));var v=r._tabId(o);o.href="#"+v;var u=a("#"+v);if(!u.length){u=a(d.panelTemplate).attr("id",v).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(r.$panels[t-1]||r.list);u.data("destroy.tabs",true)}r.$panels=r.$panels.add(u)}else{d.disabled.push(t+1)}}});if(q){if(this.element.is("div")){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all")}this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.$lis.addClass("ui-state-default ui-corner-top");this.$panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(d.selected===undefined){if(location.hash){this.$tabs.each(function(s,o){if(o.hash==location.hash){d.selected=s;return false}})}else{if(d.cookie){d.selected=parseInt(r._cookie(),10)}else{if(this.$lis.filter(".ui-tabs-selected").length){d.selected=this.$lis.index(this.$lis.filter(".ui-tabs-selected"))}else{d.selected=0}}}}else{if(d.selected===null){d.selected=-1}}d.selected=((d.selected>=0&&this.$tabs[d.selected])||d.selected<0)?d.selected:0;d.disabled=a.unique(d.disabled.concat(a.map(this.$lis.filter(".ui-state-disabled"),function(s,o){return r.$lis.index(s)}))).sort();if(a.inArray(d.selected,d.disabled)!=-1){d.disabled.splice(a.inArray(d.selected,d.disabled),1)}this.$panels.addClass("ui-tabs-hide");this.$lis.removeClass("ui-tabs-selected ui-state-active");if(d.selected>=0&&this.$tabs.length){this.$panels.eq(d.selected).removeClass("ui-tabs-hide");var f=["ui-tabs-selected ui-state-active"];if(d.deselectable){f.push("ui-tabs-deselectable")}this.$lis.eq(d.selected).addClass(f.join(" "));var k=function(){r._trigger("show",null,r._ui(r.$tabs[d.selected],r.$panels[d.selected]))};if(a.data(this.$tabs[d.selected],"load.tabs")){this.load(d.selected,k)}else{k()}}if(d.event!="mouseover"){var l=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.toggleClass("ui-state-"+o)}};this.$lis.bind("mouseover.tabs mouseout.tabs",function(){l("hover",a(this))});this.$tabs.bind("focus.tabs blur.tabs",function(){l("focus",a(this).parents("li:first"))})}a(window).bind("unload",function(){r.$lis.add(r.$tabs).unbind(".tabs");r.$lis=r.$tabs=r.$panels=null})}else{d.selected=this.$lis.index(this.$lis.filter(".ui-tabs-selected"))}if(d.cookie){this._cookie(d.selected,d.cookie)}for(var h=0,p;p=this.$lis[h];h++){a(p)[a.inArray(h,d.disabled)!=-1&&!a(p).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(d.cache===false){this.$tabs.removeData("cache.tabs")}var b,j;if(d.fx){if(a.isArray(d.fx)){b=d.fx[0];j=d.fx[1]}else{b=j=d.fx}}function e(i,o){i.css({display:""});if(a.browser.msie&&o.opacity){i[0].style.removeAttribute("filter")}}var m=j?function(i,o){o.hide().removeClass("ui-tabs-hide").animate(j,500,function(){e(o,j);r._trigger("show",null,r._ui(i,o[0]))})}:function(i,o){o.removeClass("ui-tabs-hide");r._trigger("show",null,r._ui(i,o[0]))};var n=b?function(o,i,s){i.animate(b,b.duration||"normal",function(){i.addClass("ui-tabs-hide");e(i,b);if(s){m(o,s)}})}:function(o,i,s){i.addClass("ui-tabs-hide");if(s){m(o,s)}};function g(s,u,i,t){var o=["ui-tabs-selected ui-state-active"];if(d.deselectable){o.push("ui-tabs-deselectable")}u.removeClass("ui-state-default").addClass(o.join(" ")).siblings().removeClass(o.join(" ")).addClass("ui-state-default");n(s,i,t)}this.$tabs.unbind(".tabs").bind(d.event+".tabs",function(){var t=a(this).parents("li:eq(0)"),i=r.$panels.filter(":visible"),s=a(r._sanitizeSelector(this.hash));if((t.hasClass("ui-state-active")&&!d.deselectable)||t.hasClass("ui-state-disabled")||a(this).hasClass("ui-tabs-loading")||r._trigger("select",null,r._ui(this,s[0]))===false){this.blur();return false}d.selected=r.$tabs.index(this);if(d.deselectable){if(t.hasClass("ui-state-active")){d.selected=-1;if(d.cookie){r._cookie(d.selected,d.cookie)}t.removeClass("ui-tabs-selected ui-state-active ui-tabs-deselectable").addClass("ui-state-default");r.$panels.stop();n(this,i);this.blur();return false}else{if(!i.length){if(d.cookie){r._cookie(d.selected,d.cookie)}r.$panels.stop();var o=this;r.load(r.$tabs.index(this),function(){t.addClass("ui-tabs-selected ui-state-active ui-tabs-deselectable").removeClass("ui-state-default");m(o,s)});this.blur();return false}}}if(d.cookie){r._cookie(d.selected,d.cookie)}r.$panels.stop();if(s.length){var o=this;r.load(r.$tabs.index(this),i.length?function(){g(o,t,i,s)}:function(){t.addClass("ui-tabs-selected ui-state-active").removeClass("ui-state-default");m(o,s)})}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(a.browser.msie){this.blur()}return false});if(d.event!="click"){this.$tabs.bind("click.tabs",function(){return false})}},destroy:function(){var b=this.options;this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.unbind(".tabs").removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeData("tabs");this.$tabs.each(function(){var c=a.data(this,"href.tabs");if(c){this.href=c}var d=a(this).unbind(".tabs");a.each(["href","load","cache"],function(e,f){d.removeData(f+".tabs")})});this.$lis.unbind(".tabs").add(this.$panels).each(function(){if(a.data(this,"destroy.tabs")){a(this).remove()}else{a(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-tabs-deselectable ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")}});if(b.cookie){this._cookie(null,b.cookie)}},add:function(c,h,f){if(f==undefined){f=this.$tabs.length}var i=this,e=this.options;var g=a(e.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,h));g.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var d=c.indexOf("#")==0?c.replace("#",""):this._tabId(a("a:first-child",g)[0]);var j=a("#"+d);if(!j.length){j=a(e.panelTemplate).attr("id",d).data("destroy.tabs",true)}j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(f>=this.$lis.length){g.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{g.insertBefore(this.$lis[f]);j.insertBefore(this.$panels[f])}e.disabled=a.map(e.disabled,function(l,k){return l>=f?++l:l});this._tabify();if(this.$tabs.length==1){g.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");var b=a.data(this.$tabs[0],"load.tabs");if(b){this.load(0,function(){i._trigger("show",null,i._ui(i.$tabs[0],i.$panels[0]))})}}this._trigger("add",null,this._ui(this.$tabs[f],this.$panels[f]))},remove:function(b){var d=this.options,e=this.$lis.eq(b).remove(),c=this.$panels.eq(b).remove();if(e.hasClass("ui-tabs-selected")&&this.$tabs.length>1){this.select(b+(b+1=b?--g:g});this._tabify();this._trigger("remove",null,this._ui(e.find("a")[0],c[0]))},enable:function(b){var c=this.options;if(a.inArray(b,c.disabled)==-1){return}this.$lis.eq(b).removeClass("ui-state-disabled");c.disabled=a.grep(c.disabled,function(e,d){return e!=b});this._trigger("enable",null,this._ui(this.$tabs[b],this.$panels[b]))},disable:function(c){var b=this,d=this.options;if(c!=d.selected){this.$lis.eq(c).addClass("ui-state-disabled");d.disabled.push(c);d.disabled.sort();this._trigger("disable",null,this._ui(this.$tabs[c],this.$panels[c]))}},select:function(b){if(typeof b=="string"){b=this.$tabs.index(this.$tabs.filter("[href$="+b+"]"))}this.$tabs.eq(b).trigger(this.options.event+".tabs")},load:function(g,k){var l=this,d=this.options,e=this.$tabs.eq(g),j=e[0],h=k==undefined||k===false,b=e.data("load.tabs");k=k||function(){};if(!b||!h&&a.data(j,"cache.tabs")){k();return}var m=function(n){var o=a(n),p=o.find("*:last");return p.length&&p.is(":not(img)")&&p||o};var c=function(){l.$tabs.filter(".ui-tabs-loading").removeClass("ui-tabs-loading").each(function(){if(d.spinner){m(this).parent().html(m(this).data("label.tabs"))}});l.xhr=null};if(d.spinner){var i=m(j).html();m(j).wrapInner("").find("em").data("label.tabs",i).html(d.spinner)}var f=a.extend({},d.ajaxOptions,{url:b,success:function(o,n){a(l._sanitizeSelector(j.hash)).html(o);c();if(d.cache){a.data(j,"cache.tabs",true)}l._trigger("load",null,l._ui(l.$tabs[g],l.$panels[g]));try{d.ajaxOptions.success(o,n)}catch(p){}k()}});if(this.xhr){this.xhr.abort();c()}e.addClass("ui-tabs-loading");l.xhr=a.ajax(f)},url:function(c,b){this.$tabs.eq(c).removeData("cache.tabs").data("load.tabs",b)},length:function(){return this.$tabs.length}});a.extend(a.ui.tabs,{version:"1.6rc6",getter:"length",defaults:{ajaxOptions:null,cache:false,cookie:null,deselectable:false,disabled:[],event:"click",fx:null,idPrefix:"ui-tabs-",panelTemplate:"
",spinner:"Loading…",tabTemplate:'
  • #{label}
  • '}});a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(d,f){var b=this,e=this.options.selected;function c(){clearTimeout(b.rotation);b.rotation=setTimeout(function(){e=++e')}$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",log:function(){if(this.debug){console.log.apply("",arguments)}},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){target.id="dp"+(++this.uuid)}var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){var id=target[0].id.replace(/([:\[\]\.])/g,"\\\\$1");return{id:id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:$('
    '))}},_connectDatepicker:function(target,inst){var input=$(target);if(input.hasClass(this.markerClassName)){return}var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(appendText){input[isRTL?"before":"after"](''+appendText+"")}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");var trigger=$(this._get(inst,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):$('').addClass(this._triggerClass).html(buttonImage==""?buttonText:$("").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](trigger);trigger.click(function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput==target){$.datepicker._hideDatepicker()}else{$.datepicker._showDatepicker(target)}return false})}input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst)},_inlineDatepicker:function(target,inst){var divSpan=$(target);if(divSpan.hasClass(this.markerClassName)){return}divSpan.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst));this._updateDatepicker(inst);this._updateAlternate(inst)},_dialogDatepicker:function(input,dateText,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){var id="dp"+(++this.uuid);this._dialogInput=$('');this._dialogInput.keydown(this._doKeyDown);$("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});this._dialogInput.val(dateText);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;var browserHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",this._pos[0]+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv)}$.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var $target=$(target);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();$.removeData(target,PROP_NAME);if(nodeName=="input"){$target.siblings("."+this._appendClass).remove().end().siblings("."+this._triggerClass).remove().end().removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){var $target=$(target);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=false;$target.siblings("button."+this._triggerClass).each(function(){this.disabled=false}).end().siblings("img."+this._triggerClass).css({opacity:"1.0",cursor:""})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().removeClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){var $target=$(target);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=true;$target.siblings("button."+this._triggerClass).each(function(){this.disabled=true}).end().siblings("img."+this._triggerClass).css({opacity:"0.5",cursor:"default"})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().addClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i-1)}},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=$("input",input.parentNode)[0]}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input){return}var inst=$.datepicker._getInst(input);var beforeShow=$.datepicker._get(inst,"beforeShow");extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));$.datepicker._hideDatepicker(null,"");$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){input.value=""}if(!$.datepicker._pos){$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css("position")=="fixed";return !isFixed});if(isFixed&&$.browser.opera){$.datepicker._pos[0]-=document.documentElement.scrollLeft;$.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;inst.rangeStart=null;inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});$.datepicker._updateDatepicker(inst);offset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:($.datepicker._inDialog&&$.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=$.datepicker._get(inst,"showAnim")||"show";var duration=$.datepicker._get(inst,"duration");var postProcess=function(){$.datepicker._datepickerShowing=true;if($.browser.msie&&parseInt($.browser.version,10)<7){$("iframe.ui-datepicker-cover").css({width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4})}};if($.effects&&$.effects[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim](duration,postProcess)}if(duration==""){postProcess()}if(inst.input[0].type!="hidden"){inst.input[0].focus()}$.datepicker._curInst=inst}},_updateDatepicker:function(inst){var dims={width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4};var self=this;inst.dpDiv.empty().append(this._generateHTML(inst)).find("iframe.ui-datepicker-cover").css({width:dims.width,height:dims.height}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){$(this).removeClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).removeClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).removeClass("ui-datepicker-next-hover")}}).bind("mouseover",function(){if(!self._isDisabledDatepicker(inst.inline?inst.dpDiv.parent()[0]:inst.input[0])){$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");$(this).addClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).addClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).addClass("ui-datepicker-next-hover")}}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();var numMonths=this._getNumberOfMonths(inst);var cols=numMonths[1];var width=17;if(cols>1){inst.dpDiv.addClass("ui-datepicker-multi-"+cols).css("width",(width*cols)+"em")}else{inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("")}inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst.input&&inst.input[0].type!="hidden"&&inst==$.datepicker._curInst){$(inst.input[0]).focus()}},_checkOffset:function(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth();var dpHeight=inst.dpDiv.outerHeight();var inputWidth=inst.input?inst.input.outerWidth():0;var inputHeight=inst.input?inst.input.outerHeight():0;var viewWidth=(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)+$(document).scrollLeft();var viewHeight=(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight)+$(document).scrollTop();offset.left-=(this._get(inst,"isRTL")?(dpWidth-inputWidth):0);offset.left-=(isFixed&&offset.left==inst.input.offset().left)?$(document).scrollLeft():0;offset.top-=(isFixed&&offset.top==(inst.input.offset().top+inputHeight))?$(document).scrollTop():0;offset.left-=(offset.left+dpWidth>viewWidth&&viewWidth>dpWidth)?Math.abs(offset.left+dpWidth-viewWidth):0;offset.top-=(offset.top+dpHeight>viewHeight&&viewHeight>dpHeight)?Math.abs(offset.top+dpHeight+inputHeight*2-viewHeight):0;return offset},_findPos:function(obj){while(obj&&(obj.type=="hidden"||obj.nodeType!=1)){obj=obj.nextSibling}var position=$(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input,duration){var inst=this._curInst;if(!inst||(input&&inst!=$.data(input,PROP_NAME))){return}if(inst.stayOpen){this._selectDate("#"+inst.id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))}inst.stayOpen=false;if(this._datepickerShowing){duration=(duration!=null?duration:this._get(inst,"duration"));var showAnim=this._get(inst,"showAnim");var postProcess=function(){$.datepicker._tidyDialog(inst)};if(duration!=""&&$.effects&&$.effects[showAnim]){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(duration==""?"hide":(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide")))](duration,postProcess)}if(duration==""){this._tidyDialog(inst)}var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[(inst.input?inst.input.val():""),inst])}this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if($.blockUI){$.unblockUI();$("body").append(this.dpDiv)}}this._inDialog=false}this._curInst=null},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(event){if(!$.datepicker._curInst){return}var $target=$(event.target);if(($target.parents("#"+$.datepicker._mainDivId).length==0)&&!$target.hasClass($.datepicker.markerClassName)&&!$target.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)){$.datepicker._hideDatepicker(null,"")}},_adjustDate:function(id,offset,period){var target=$(id);var inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return}this._adjustInstDate(inst,offset+(period=="M"?this._get(inst,"showCurrentAtPos"):0),period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=$(id);var inst=this._getInst(target[0]);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._notifyChange(inst);this._adjustDate(target)},_selectMonthYear:function(id,select,period){var target=$(id);var inst=this._getInst(target[0]);inst._selectingMonthYear=false;inst["selected"+(period=="M"?"Month":"Year")]=inst["draw"+(period=="M"?"Month":"Year")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target)},_clickMonthYear:function(id){var target=$(id);var inst=this._getInst(target[0]);if(inst.input&&inst._selectingMonthYear&&!$.browser.msie){inst.input[0].focus()}inst._selectingMonthYear=!inst._selectingMonthYear},_selectDay:function(id,month,year,td){var target=$(id);if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return}var inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=$("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;if(inst.stayOpen){inst.endDay=inst.endMonth=inst.endYear=null}this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));if(inst.stayOpen){inst.rangeStart=this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));this._updateDatepicker(inst)}},_clearDate:function(id){var target=$(id);var inst=this._getInst(target[0]);inst.stayOpen=false;inst.endDay=inst.endMonth=inst.endYear=inst.rangeStart=null;this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=$(id);var inst=this._getInst(target[0]);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{if(!inst.stayOpen){this._hideDatepicker(null,this._get(inst,"duration"));this._lastInput=inst.input[0];if(typeof(inst.input[0])!="object"){inst.input[0].focus()}this._lastInput=null}}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat")||this._get(inst,"dateFormat");var date=this._getDate(inst);dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));$(altField).each(function(){$(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());var firstMon=new Date(checkDate.getFullYear(),1-1,4);var firstDay=firstMon.getDay()||7;firstMon.setDate(firstMon.getDate()+1-firstDay);if(firstDay<4&&checkDatenew Date(checkDate.getFullYear(),12-1,28)){firstDay=new Date(checkDate.getFullYear()+1,1-1,4).getDay()||7;if(firstDay>4&&(checkDate.getDay()||7)0&&iValue="0"&&value.charAt(iValue)<="9"){num=num*10+parseInt(value.charAt(iValue++),10);size--}if(size==origSize){throw"Missing number at position "+iValue}return num};var getName=function(match,shortNames,longNames){var names=(lookAhead(match)?longNames:shortNames);var size=0;for(var j=0;j0&&iValue-1){month=1;day=doy;do{var dim=this._getDaysInMonth(year,month-1);if(day<=dim){break}month++;day-=dim}while(true)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TIMESTAMP:"@",W3C:"yy-mm-dd",formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+1=0;m--){doy+=this._getDaysInMonth(date.getFullYear(),m)}output+=formatNumber("o",doy,3);break;case"m":output+=formatNumber("m",date.getMonth()+1,2);break;case"M":output+=formatName("M",date.getMonth(),monthNamesShort,monthNames);break;case"y":output+=(lookAhead("y")?date.getFullYear():(date.getYear()%100<10?"0":"")+date.getYear()%100);break;case"@":output+=date.getTime();break;case"'":if(lookAhead("'")){output+="'"}else{literal=true}break;default:output+=format.charAt(iFormat)}}}}return output},_possibleChars:function(format){var chars="";var literal=false;for(var iFormat=0;iFormatmaxDate?maxDate:date);return date},_determineDate:function(date,defaultDate){var offsetNumeric=function(offset){var date=new Date();date.setDate(date.getDate()+offset);return date};var offsetString=function(offset,getDaysInMonth){var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||"d"){case"d":case"D":day+=parseInt(matches[1],10);break;case"w":case"W":day+=parseInt(matches[1],10)*7;break;case"m":case"M":month+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break;case"y":case"Y":year+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break}matches=pattern.exec(offset)}return new Date(year,month,day)};date=(date==null?defaultDate:(typeof date=="string"?offsetString(date,this._getDaysInMonth):(typeof date=="number"?(isNaN(date)?defaultDate:offsetNumeric(date)):date)));date=(date&&date.toString()=="Invalid Date"?defaultDate:date);if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0)}return this._daylightSavingAdjust(date)},_daylightSavingAdjust:function(date){if(!date){return null}date.setHours(date.getHours()>12?date.getHours()+2:0);return date},_setDate:function(inst,date,endDate){var clear=!(date);var origMonth=inst.selectedMonth;var origYear=inst.selectedYear;date=this._determineDate(date,new Date());inst.selectedDay=inst.currentDay=date.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();if(origMonth!=inst.selectedMonth||origYear!=inst.selectedYear){this._notifyChange(inst)}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return startDate},_generateHTML:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var isRTL=this._get(inst,"isRTL");var showButtonPanel=this._get(inst,"showButtonPanel");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var showCurrentAtPos=this._get(inst,"showCurrentAtPos");var stepMonths=this._get(inst,"stepMonths");var stepBigMonths=this._get(inst,"stepBigMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth-showCurrentAtPos;var drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--}if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[1]+1,maxDate.getDate()));maxDraw=(minDate&&maxDrawmaxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev=(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?''+prevText+"":(hideIfNoPrevNext?"":''+prevText+""));var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next=(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?''+nextText+"":(hideIfNoPrevNext?"":''+nextText+""));var currentText=this._get(inst,"currentText");var gotoDate=(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today);currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)));var controls='";var buttonPanel=(showButtonPanel)?'
    '+(isRTL?controls:"")+(this._isInRange(inst,gotoDate)?'":"")+(isRTL?"":controls)+"
    ":"";var firstDay=parseInt(this._get(inst,"firstDay"),10);firstDay=(isNaN(firstDay)?0:firstDay);var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var monthNamesShort=this._get(inst,"monthNamesShort");var beforeShowDay=this._get(inst,"beforeShowDay");var showOtherMonths=this._get(inst,"showOtherMonths");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var endDate=inst.endDay?this._daylightSavingAdjust(new Date(inst.endYear,inst.endMonth,inst.endDay)):currentDate;var defaultDate=this._getDefaultDate(inst);var html="";for(var row=0;row'+(/all|left/.test(cornerClass)&&row==0?(isRTL?next:prev):"")+(/all|right/.test(cornerClass)&&row==0?(isRTL?prev:next):"")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,row>0||col>0,monthNames,monthNamesShort)+'';var thead="";for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;thead+="=5?' class="ui-datepicker-week-end"':"")+'>'+dayNamesMin[day]+""}calender+=thead+"";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow";var tbody="";for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=otherMonth||!daySettings[0]||(minDate&&printDatemaxDate);tbody+='";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}calender+=tbody+""}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}calender+="
    =currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" "+this._currentClass:"")+(printDate.getTime()==today.getTime()?" ui-datepicker-today":""))+'"'+((!otherMonth||showOtherMonths)&&daySettings[2]?' title="'+daySettings[2]+'"':"")+(unselectable?"":" onclick=\"jQuery.datepicker._selectDay('#"+inst.id+"',"+drawMonth+","+drawYear+', this);return false;"')+">"+(otherMonth?(showOtherMonths?printDate.getDate():" "):(unselectable?''+printDate.getDate()+"":'=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" ui-state-active":"")+'" href="#">'+printDate.getDate()+""))+"
    "+(isMultiMonth?"":"");group+=calender}html+=group}html+=(!inst.inline?buttonPanel:"")+($.browser.msie&&parseInt($.browser.version,10)<7&&!inst.inline?'':"");inst._keyEvent=false;return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,secondary,monthNames,monthNamesShort){minDate=(inst.rangeStart&&minDate&&selectedDate "}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);monthHtml+='"}if(!showMonthAfterYear){html+=monthHtml+((secondary||changeMonth||changeYear)&&(!(changeMonth&&changeYear))?" ":"")}if(secondary||!changeYear){html+=''+drawYear+""}else{var years=this._get(inst,"yearRange").split(":");var year=0;var endYear=0;if(years.length!=2){year=drawYear-10;endYear=drawYear+10}else{if(years[0].charAt(0)=="+"||years[0].charAt(0)=="-"){year=drawYear+parseInt(years[0],10);endYear=drawYear+parseInt(years[1],10)}else{year=parseInt(years[0],10);endYear=parseInt(years[1],10)}}year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);html+='"}if(showMonthAfterYear){html+=(secondary||changeMonth||changeYear?" ":"")+monthHtml}html+="";return html},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._daylightSavingAdjust(new Date(year,month,day));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&datemaxDate?maxDate:date);inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[inst.selectedYear,inst.selectedMonth+1,inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax,checkRange){var date=this._determineDate(this._get(inst,minMax+"Date"),null);return(!checkRange||!inst.rangeStart?date:(!date||inst.rangeStart>date?inst.rangeStart:date))},_getDaysInMonth:function(year,month){return 32-new Date(year,month,32).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var newMinDate=(!inst.rangeStart?null:this._daylightSavingAdjust(new Date(inst.selectedYear,inst.selectedMonth,inst.selectedDay)));newMinDate=(newMinDate&&inst.rangeStart=minDate)&&(!maxDate||date<=maxDate))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&(($.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}$.fn.datepicker=function(options){if(!$.datepicker.initialized){$(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv);$.datepicker.initialized=true}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate")){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?$.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options)})};$.datepicker=new Datepicker();$.datepicker.initialized=false;$.datepicker.uuid=new Date().getTime();$.datepicker.version="1.6rc6"})(jQuery);/* + * jQuery UI Progressbar 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.progressbar",{_init:function(){var b=this,c=this.options;this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=a('
    ').appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow").removeData("progressbar").unbind(".progressbar");this.valueDiv.remove();a.widget.prototype.destroy.apply(this,arguments)},value:function(b){arguments.length&&this._setData("value",b);return this._value()},_setData:function(b,c){switch(b){case"value":this.options.value=c;this._refreshValue();this._trigger("change",null,{});break}a.widget.prototype._setData.apply(this,arguments)},_value:function(){var b=this.options.value;if(bthis._valueMax()){b=this._valueMax()}return b},_valueMin:function(){var b=0;return b},_valueMax:function(){var b=100;return b},_refreshValue:function(){var b=this.value();this.valueDiv[b==this._valueMax()?"addClass":"removeClass"]("ui-corner-right");this.valueDiv.width(b+"%");this.element.attr("aria-valuenow",b)}});a.extend(a.ui.progressbar,{version:"1.6rc6",defaults:{value:0}})})(jQuery);/* + * jQuery UI Effects 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +(function(d){d.effects=d.effects||{};d.extend(d.effects,{version:"1.6rc6",save:function(g,h){for(var f=0;f');var j=f.parent();if(f.css("position")=="static"){j.css({position:"relative"});f.css({position:"relative"})}else{var i=f.css("top");if(isNaN(parseInt(i,10))){i="auto"}var h=f.css("left");if(isNaN(parseInt(h,10))){h="auto"}j.css({position:f.css("position"),top:i,left:h,zIndex:f.css("z-index")}).show();f.css({position:"relative",top:0,left:0})}j.css(g);return j},removeWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent().replaceWith(f)}return f},setTransition:function(g,i,f,h){h=h||{};d.each(i,function(k,j){unit=g.cssUnit(j);if(unit[0]>0){h[j]=unit[0]*f+unit[1]}});return h},animateClass:function(h,i,k,j){var f=(typeof k=="function"?k:(j?j:null));var g=(typeof k=="string"?k:null);return this.each(function(){var q={};var o=d(this);var p=o.attr("style")||"";if(typeof p=="object"){p=p.cssText}if(h.toggle){o.hasClass(h.toggle)?h.remove=h.toggle:h.add=h.toggle}var l=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.addClass(h.add)}if(h.remove){o.removeClass(h.remove)}var m=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.removeClass(h.add)}if(h.remove){o.addClass(h.remove)}for(var r in m){if(typeof m[r]!="function"&&m[r]&&r.indexOf("Moz")==-1&&r.indexOf("length")==-1&&m[r]!=l[r]&&(r.match(/color/i)||(!r.match(/color/i)&&!isNaN(parseInt(m[r],10))))&&(l.position!="static"||(l.position=="static"&&!r.match(/left|top|bottom|right/)))){q[r]=m[r]}}o.animate(q,i,g,function(){if(typeof d(this).attr("style")=="object"){d(this).attr("style")["cssText"]="";d(this).attr("style")["cssText"]=p}else{d(this).attr("style",p)}if(h.add){d(this).addClass(h.add)}if(h.remove){d(this).removeClass(h.remove)}if(f){f.apply(this,arguments)}})})}});function c(g,f){var i=g[1]&&g[1].constructor==Object?g[1]:{};if(f){i.mode=f}var h=g[1]&&g[1].constructor!=Object?g[1]:i.duration;h=d.fx.off?0:typeof h==="number"?h:d.fx.speeds[h]||d.fx.speeds._default;var j=i.callback||(d.isFunction(g[2])&&g[2])||(d.isFunction(g[3])&&g[3]);return[g[0],i,h,j]}d.fn.extend({_show:d.fn.show,_hide:d.fn.hide,__toggle:d.fn.toggle,_addClass:d.fn.addClass,_removeClass:d.fn.removeClass,_toggleClass:d.fn.toggleClass,effect:function(g,f,h,i){return d.effects[g]?d.effects[g].call(this,{method:g,options:f||{},duration:h,callback:i}):null},show:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._show.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"show"))}},hide:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._hide.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"hide"))}},toggle:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))||(arguments[0].constructor==Function)){return this.__toggle.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"toggle"))}},addClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{add:g},f,i,h]):this._addClass(g)},removeClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{remove:g},f,i,h]):this._removeClass(g)},toggleClass:function(g,f,i,h){return((typeof f!=="boolean")&&f)?d.effects.animateClass.apply(this,[{toggle:g},f,i,h]):this._toggleClass(g,f)},morph:function(f,h,g,j,i){return d.effects.animateClass.apply(this,[{add:h,remove:f},g,j,i])},switchClass:function(){return this.morph.apply(this,arguments)},cssUnit:function(f){var g=this.css(f),h=[];d.each(["em","px","%","pt"],function(j,k){if(g.indexOf(k)>0){h=[parseFloat(g),k]}});return h}});d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(g,f){d.fx.step[f]=function(h){if(h.state==0){h.start=e(h.elem,f);h.end=b(h.end)}h.elem.style[f]="rgb("+[Math.max(Math.min(parseInt((h.pos*(h.end[0]-h.start[0]))+h.start[0],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[1]-h.start[1]))+h.start[1],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[2]-h.start[2]))+h.start[2],10),255),0)].join(",")+")"}});function b(g){var f;if(g&&g.constructor==Array&&g.length==3){return g}if(f=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(g)){return[parseInt(f[1],10),parseInt(f[2],10),parseInt(f[3],10)]}if(f=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(g)){return[parseFloat(f[1])*2.55,parseFloat(f[2])*2.55,parseFloat(f[3])*2.55]}if(f=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(g)){return[parseInt(f[1],16),parseInt(f[2],16),parseInt(f[3],16)]}if(f=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(g)){return[parseInt(f[1]+f[1],16),parseInt(f[2]+f[2],16),parseInt(f[3]+f[3],16)]}if(f=/rgba\(0, 0, 0, 0\)/.exec(g)){return a.transparent}return a[d.trim(g).toLowerCase()]}function e(h,f){var g;do{g=d.curCSS(h,f);if(g!=""&&g!="transparent"||d.nodeName(h,"body")){break}f="backgroundColor"}while(h=h.parentNode);return b(g)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};d.easing.jswing=d.easing.swing;d.extend(d.easing,{def:"easeOutQuad",swing:function(g,h,f,j,i){return d.easing[d.easing.def](g,h,f,j,i)},easeInQuad:function(g,h,f,j,i){return j*(h/=i)*h+f},easeOutQuad:function(g,h,f,j,i){return -j*(h/=i)*(h-2)+f},easeInOutQuad:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h+f}return -j/2*((--h)*(h-2)-1)+f},easeInCubic:function(g,h,f,j,i){return j*(h/=i)*h*h+f},easeOutCubic:function(g,h,f,j,i){return j*((h=h/i-1)*h*h+1)+f},easeInOutCubic:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h+f}return j/2*((h-=2)*h*h+2)+f},easeInQuart:function(g,h,f,j,i){return j*(h/=i)*h*h*h+f},easeOutQuart:function(g,h,f,j,i){return -j*((h=h/i-1)*h*h*h-1)+f},easeInOutQuart:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h+f}return -j/2*((h-=2)*h*h*h-2)+f},easeInQuint:function(g,h,f,j,i){return j*(h/=i)*h*h*h*h+f},easeOutQuint:function(g,h,f,j,i){return j*((h=h/i-1)*h*h*h*h+1)+f},easeInOutQuint:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h*h+f}return j/2*((h-=2)*h*h*h*h+2)+f},easeInSine:function(g,h,f,j,i){return -j*Math.cos(h/i*(Math.PI/2))+j+f},easeOutSine:function(g,h,f,j,i){return j*Math.sin(h/i*(Math.PI/2))+f},easeInOutSine:function(g,h,f,j,i){return -j/2*(Math.cos(Math.PI*h/i)-1)+f},easeInExpo:function(g,h,f,j,i){return(h==0)?f:j*Math.pow(2,10*(h/i-1))+f},easeOutExpo:function(g,h,f,j,i){return(h==i)?f+j:j*(-Math.pow(2,-10*h/i)+1)+f},easeInOutExpo:function(g,h,f,j,i){if(h==0){return f}if(h==i){return f+j}if((h/=i/2)<1){return j/2*Math.pow(2,10*(h-1))+f}return j/2*(-Math.pow(2,-10*--h)+2)+f},easeInCirc:function(g,h,f,j,i){return -j*(Math.sqrt(1-(h/=i)*h)-1)+f},easeOutCirc:function(g,h,f,j,i){return j*Math.sqrt(1-(h=h/i-1)*h)+f},easeInOutCirc:function(g,h,f,j,i){if((h/=i/2)<1){return -j/2*(Math.sqrt(1-h*h)-1)+f}return j/2*(Math.sqrt(1-(h-=2)*h)+1)+f},easeInElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h").css({position:"absolute",visibility:"visible",left:-d*(g/e),top:-f*(c/k)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/e,height:c/k,left:l.left+d*(g/e)+(b.options.mode=="show"?(d-Math.floor(e/2))*(g/e):0),top:l.top+f*(c/k)+(b.options.mode=="show"?(f-Math.floor(k/2))*(c/k):0),opacity:b.options.mode=="show"?0:1}).animate({left:l.left+d*(g/e)+(b.options.mode=="show"?0:(d-Math.floor(e/2))*(g/e)),top:l.top+f*(c/k)+(b.options.mode=="show"?0:(f-Math.floor(k/2))*(c/k)),opacity:b.options.mode=="show"?1:0},b.duration||500)}}setTimeout(function(){b.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();if(b.callback){b.callback.apply(h[0])}h.dequeue();a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);/* + * jQuery UI Effects Fold 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * effects.core.js + */ +(function(a){a.effects.fold=function(b){return this.queue(function(){var e=a(this),k=["position","top","left"];var h=a.effects.setMode(e,b.options.mode||"hide");var o=b.options.size||15;var n=!(!b.options.horizFirst);var g=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(e,k);e.show();var d=a.effects.createWrapper(e).css({overflow:"hidden"});var i=((h=="show")!=n);var f=i?["width","height"]:["height","width"];var c=i?[d.width(),d.height()]:[d.height(),d.width()];var j=/([0-9]+)%/.exec(o);if(j){o=parseInt(j[1])/100*c[h=="hide"?0:1]}if(h=="show"){d.css(n?{height:0,width:o}:{height:o,width:0})}var m={},l={};m[f[0]]=h=="show"?c[0]:o;l[f[1]]=h=="show"?c[1]:0;d.animate(m,g,b.options.easing).animate(l,g,b.options.easing,function(){if(h=="hide"){e.hide()}a.effects.restore(e,k);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(e[0],arguments)}e.dequeue()})})}})(jQuery);/* + * jQuery UI Effects Highlight 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * effects.core.js + */ +(function(a){a.effects.highlight=function(b){return this.queue(function(){var e=a(this),d=["backgroundImage","backgroundColor","opacity"];var h=a.effects.setMode(e,b.options.mode||"show");var c=b.options.color||"#ffff99";var g=e.css("backgroundColor");a.effects.save(e,d);e.show();e.css({backgroundImage:"none",backgroundColor:c});var f={backgroundColor:g};if(h=="hide"){f.opacity=0}e.animate(f,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(h=="hide"){e.hide()}a.effects.restore(e,d);if(h=="show"&&a.browser.msie){this.style.removeAttribute("filter")}if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);/* + * jQuery UI Effects Pulsate 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * effects.core.js + */ +(function(a){a.effects.pulsate=function(b){return this.queue(function(){var d=a(this);var g=a.effects.setMode(d,b.options.mode||"show");var f=b.options.times||5;var e=b.duration?b.duration/2:a.fx.speeds._default/2;if(g=="hide"){f--}if(d.is(":hidden")){d.css("opacity",0);d.show();d.animate({opacity:1},e,b.options.easing);f=f-2}for(var c=0;c').appendTo(document.body);if(b.options.className){d.addClass(b.options.className)}d.addClass(b.options.className);d.css({top:c.top,left:c.left,height:e.outerHeight()-parseInt(d.css("borderTopWidth"))-parseInt(d.css("borderBottomWidth")),width:e.outerWidth()-parseInt(d.css("borderLeftWidth"))-parseInt(d.css("borderRightWidth")),position:"absolute"});c=f.offset();animation={top:c.top,left:c.left,height:f.outerHeight()-parseInt(d.css("borderTopWidth"))-parseInt(d.css("borderBottomWidth")),width:f.outerWidth()-parseInt(d.css("borderLeftWidth"))-parseInt(d.css("borderRightWidth"))};d.animate(animation,b.duration,b.options.easing,function(){d.remove();if(b.callback){b.callback.apply(e[0],arguments)}e.dequeue()})})}})(jQuery); \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/test.php b/code/ryzom/tools/server/www/webtt/app/webroot/test.php new file mode 100644 index 000000000..2c2e9a82b --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/test.php @@ -0,0 +1,94 @@ + + * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * + * Licensed under The Open Group Test Suite License + * Redistributions of files must retain the above copyright notice. + * + * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) + * @link http://book.cakephp.org/view/1196/Testing + * @package cake + * @subpackage cake.app.webroot + * @since CakePHP(tm) v 1.2.0.4433 + * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License + */ +set_time_limit(0); +ini_set('display_errors', 1); +/** + * Use the DS to separate the directories in other defines + */ + if (!defined('DS')) { + define('DS', DIRECTORY_SEPARATOR); + } +/** + * These defines should only be edited if you have cake installed in + * a directory layout other than the way it is distributed. + * When using custom settings be sure to use the DS and do not add a trailing DS. + */ + +/** + * The full path to the directory which holds "app", WITHOUT a trailing DS. + * + */ + if (!defined('ROOT')) { + define('ROOT', dirname(dirname(dirname(__FILE__)))); + } +/** + * The actual directory name for the "app". + * + */ + if (!defined('APP_DIR')) { + define('APP_DIR', basename(dirname(dirname(__FILE__)))); + } +/** + * The absolute path to the "cake" directory, WITHOUT a trailing DS. + * + */ + if (!defined('CAKE_CORE_INCLUDE_PATH')) { + define('CAKE_CORE_INCLUDE_PATH', ROOT); + } + +/** + * Editing below this line should not be necessary. + * Change at your own risk. + * + */ +if (!defined('WEBROOT_DIR')) { + define('WEBROOT_DIR', basename(dirname(__FILE__))); +} +if (!defined('WWW_ROOT')) { + define('WWW_ROOT', dirname(__FILE__) . DS); +} +if (!defined('CORE_PATH')) { + if (function_exists('ini_set') && ini_set('include_path', CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS . APP_DIR . DS . PATH_SEPARATOR . ini_get('include_path'))) { + define('APP_PATH', null); + define('CORE_PATH', null); + } else { + define('APP_PATH', ROOT . DS . APP_DIR . DS); + define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS); + } +} +if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) { + trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR); +} + +$corePath = App::core('cake'); +if (isset($corePath[0])) { + define('TEST_CAKE_CORE_INCLUDE_PATH', rtrim($corePath[0], DS) . DS); +} else { + define('TEST_CAKE_CORE_INCLUDE_PATH', CAKE_CORE_INCLUDE_PATH); +} + +if (Configure::read('debug') < 1) { + die(__('Debug setting does not allow access to this url.', true)); +} + +require_once CAKE_TESTS_LIB . 'cake_test_suite_dispatcher.php'; + +$Dispatcher = new CakeTestSuiteDispatcher(); +$Dispatcher->dispatch(); diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/testfiles/raw_testfile.csv b/code/ryzom/tools/server/www/webtt/app/webroot/testfiles/raw_testfile.csv new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/testfiles/testdir/ugatestindir.csv b/code/ryzom/tools/server/www/webtt/app/webroot/testfiles/testdir/ugatestindir.csv new file mode 100644 index 000000000..a65b80e40 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/app/webroot/testfiles/testdir/ugatestindir.csv @@ -0,0 +1,6 @@ +fdg +dfg +dfg +sd +fgsd +gsd diff --git a/code/ryzom/tools/server/www/webtt/app/webroot/testfiles/ugabla.csv b/code/ryzom/tools/server/www/webtt/app/webroot/testfiles/ugabla.csv new file mode 100644 index 000000000..e69de29bb diff --git a/code/ryzom/tools/server/www/webtt/cake/LICENSE.txt b/code/ryzom/tools/server/www/webtt/cake/LICENSE.txt new file mode 100644 index 000000000..bf6f82dd4 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/LICENSE.txt @@ -0,0 +1,22 @@ +The MIT License + +CakePHP(tm) : The Rapid Development PHP Framework (http://cakephp.org) +Copyright 2005-2010, Cake Software Foundation, Inc. + +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 diff --git a/code/ryzom/tools/server/www/webtt/cake/VERSION.txt b/code/ryzom/tools/server/www/webtt/cake/VERSION.txt new file mode 100644 index 000000000..f443e5a7c --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/VERSION.txt @@ -0,0 +1,21 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +--------------------------------------------------------------------------------------------+ // +// CakePHP Version +// +// Holds a static string representing the current version of CakePHP +// +// CakePHP(tm) : Rapid Development Framework (http://cakephp.org) +// Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +// +// Licensed under The MIT License +// Redistributions of files must retain the above copyright notice. +// +// @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) +// @link http://cakephp.org +// @package cake +// @subpackage cake.cake.libs +// @since CakePHP(tm) v 0.2.9 +// @license MIT License (http://www.opensource.org/licenses/mit-license.php) +// +--------------------------------------------------------------------------------------------+ // +//////////////////////////////////////////////////////////////////////////////////////////////////// +1.3.9 diff --git a/code/ryzom/tools/server/www/webtt/cake/basics.php b/code/ryzom/tools/server/www/webtt/cake/basics.php new file mode 100644 index 000000000..ac3f02ae0 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/basics.php @@ -0,0 +1,1026 @@ + 0) { + if ($showFrom) { + $calledFrom = debug_backtrace(); + echo '' . substr(str_replace(ROOT, '', $calledFrom[0]['file']), 1) . ''; + echo ' (line ' . $calledFrom[0]['line'] . ')'; + } + echo "\n
    \n";
    +
    +			$var = print_r($var, true);
    +			if ($showHtml) {
    +				$var = str_replace('<', '<', str_replace('>', '>', $var));
    +			}
    +			echo $var . "\n
    \n"; + } + } +if (!function_exists('getMicrotime')) { + +/** + * Returns microtime for execution time checking + * + * @return float Microtime + */ + function getMicrotime() { + list($usec, $sec) = explode(' ', microtime()); + return ((float)$usec + (float)$sec); + } +} +if (!function_exists('sortByKey')) { + +/** + * Sorts given $array by key $sortby. + * + * @param array $array Array to sort + * @param string $sortby Sort by this key + * @param string $order Sort order asc/desc (ascending or descending). + * @param integer $type Type of sorting to perform + * @return mixed Sorted array + */ + function sortByKey(&$array, $sortby, $order = 'asc', $type = SORT_NUMERIC) { + if (!is_array($array)) { + return null; + } + + foreach ($array as $key => $val) { + $sa[$key] = $val[$sortby]; + } + + if ($order == 'asc') { + asort($sa, $type); + } else { + arsort($sa, $type); + } + + foreach ($sa as $key => $val) { + $out[] = $array[$key]; + } + return $out; + } +} +if (!function_exists('array_combine')) { + +/** + * Combines given identical arrays by using the first array's values as keys, + * and the second one's values as values. (Implemented for backwards compatibility with PHP4) + * + * @param array $a1 Array to use for keys + * @param array $a2 Array to use for values + * @return mixed Outputs either combined array or false. + * @deprecated Will be removed in 2.0 + */ + function array_combine($a1, $a2) { + $a1 = array_values($a1); + $a2 = array_values($a2); + $c1 = count($a1); + $c2 = count($a2); + + if ($c1 != $c2) { + return false; + } + if ($c1 <= 0) { + return false; + } + $output = array(); + + for ($i = 0; $i < $c1; $i++) { + $output[$a1[$i]] = $a2[$i]; + } + return $output; + } +} + +/** + * Convenience method for htmlspecialchars. + * + * @param string $text Text to wrap through htmlspecialchars + * @param string $charset Character set to use when escaping. Defaults to config value in 'App.encoding' or 'UTF-8' + * @return string Wrapped text + * @link http://book.cakephp.org/view/1132/h + */ + function h($text, $charset = null) { + if (is_array($text)) { + return array_map('h', $text); + } + + static $defaultCharset = false; + if ($defaultCharset === false) { + $defaultCharset = Configure::read('App.encoding'); + if ($defaultCharset === null) { + $defaultCharset = 'UTF-8'; + } + } + if ($charset) { + return htmlspecialchars($text, ENT_QUOTES, $charset); + } else { + return htmlspecialchars($text, ENT_QUOTES, $defaultCharset); + } + } + +/** + * Splits a dot syntax plugin name into its plugin and classname. + * If $name does not have a dot, then index 0 will be null. + * + * Commonly used like `list($plugin, $name) = pluginSplit($name);` + * + * @param string $name The name you want to plugin split. + * @param boolean $dotAppend Set to true if you want the plugin to have a '.' appended to it. + * @param string $plugin Optional default plugin to use if no plugin is found. Defaults to null. + * @return array Array with 2 indexes. 0 => plugin name, 1 => classname + */ + function pluginSplit($name, $dotAppend = false, $plugin = null) { + if (strpos($name, '.') !== false) { + $parts = explode('.', $name, 2); + if ($dotAppend) { + $parts[0] .= '.'; + } + return $parts; + } + return array($plugin, $name); + } + +/** + * Returns an array of all the given parameters. + * + * Example: + * + * `a('a', 'b')` + * + * Would return: + * + * `array('a', 'b')` + * + * @return array Array of given parameters + * @link http://book.cakephp.org/view/1122/a + * @deprecated Will be removed in 2.0 + */ + function a() { + $args = func_get_args(); + return $args; + } + +/** + * Constructs associative array from pairs of arguments. + * + * Example: + * + * `aa('a','b')` + * + * Would return: + * + * `array('a'=>'b')` + * + * @return array Associative array + * @link http://book.cakephp.org/view/1123/aa + * @deprecated Will be removed in 2.0 + */ + function aa() { + $args = func_get_args(); + $argc = count($args); + for ($i = 0; $i < $argc; $i++) { + if ($i + 1 < $argc) { + $a[$args[$i]] = $args[$i + 1]; + } else { + $a[$args[$i]] = null; + } + $i++; + } + return $a; + } + +/** + * Convenience method for echo(). + * + * @param string $text String to echo + * @link http://book.cakephp.org/view/1129/e + * @deprecated Will be removed in 2.0 + */ + function e($text) { + echo $text; + } + +/** + * Convenience method for strtolower(). + * + * @param string $str String to lowercase + * @return string Lowercased string + * @link http://book.cakephp.org/view/1134/low + * @deprecated Will be removed in 2.0 + */ + function low($str) { + return strtolower($str); + } + +/** + * Convenience method for strtoupper(). + * + * @param string $str String to uppercase + * @return string Uppercased string + * @link http://book.cakephp.org/view/1139/up + * @deprecated Will be removed in 2.0 + */ + function up($str) { + return strtoupper($str); + } + +/** + * Convenience method for str_replace(). + * + * @param string $search String to be replaced + * @param string $replace String to insert + * @param string $subject String to search + * @return string Replaced string + * @link http://book.cakephp.org/view/1137/r + * @deprecated Will be removed in 2.0 + */ + function r($search, $replace, $subject) { + return str_replace($search, $replace, $subject); + } + +/** + * Print_r convenience function, which prints out
     tags around
    + * the output of given array. Similar to debug().
    + *
    + * @see	debug()
    + * @param array $var Variable to print out
    + * @link http://book.cakephp.org/view/1136/pr
    + */
    +	function pr($var) {
    +		if (Configure::read() > 0) {
    +			echo '
    ';
    +			print_r($var);
    +			echo '
    '; + } + } + +/** + * Display parameters. + * + * @param mixed $p Parameter as string or array + * @return string + * @deprecated Will be removed in 2.0 + */ + function params($p) { + if (!is_array($p) || count($p) == 0) { + return null; + } + if (is_array($p[0]) && count($p) == 1) { + return $p[0]; + } + return $p; + } + +/** + * Merge a group of arrays + * + * @param array First array + * @param array Second array + * @param array Third array + * @param array Etc... + * @return array All array parameters merged into one + * @link http://book.cakephp.org/view/1124/am + */ + function am() { + $r = array(); + $args = func_get_args(); + foreach ($args as $a) { + if (!is_array($a)) { + $a = array($a); + } + $r = array_merge($r, $a); + } + return $r; + } + +/** + * Gets an environment variable from available sources, and provides emulation + * for unsupported or inconsistent environment variables (i.e. DOCUMENT_ROOT on + * IIS, or SCRIPT_NAME in CGI mode). Also exposes some additional custom + * environment information. + * + * @param string $key Environment variable name. + * @return string Environment variable setting. + * @link http://book.cakephp.org/view/1130/env + */ + function env($key) { + if ($key == 'HTTPS') { + if (isset($_SERVER['HTTPS'])) { + return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'); + } + return (strpos(env('SCRIPT_URI'), 'https://') === 0); + } + + if ($key == 'SCRIPT_NAME') { + if (env('CGI_MODE') && isset($_ENV['SCRIPT_URL'])) { + $key = 'SCRIPT_URL'; + } + } + + $val = null; + if (isset($_SERVER[$key])) { + $val = $_SERVER[$key]; + } elseif (isset($_ENV[$key])) { + $val = $_ENV[$key]; + } elseif (getenv($key) !== false) { + $val = getenv($key); + } + + if ($key === 'REMOTE_ADDR' && $val === env('SERVER_ADDR')) { + $addr = env('HTTP_PC_REMOTE_ADDR'); + if ($addr !== null) { + $val = $addr; + } + } + + if ($val !== null) { + return $val; + } + + switch ($key) { + case 'SCRIPT_FILENAME': + if (defined('SERVER_IIS') && SERVER_IIS === true) { + return str_replace('\\\\', '\\', env('PATH_TRANSLATED')); + } + break; + case 'DOCUMENT_ROOT': + $name = env('SCRIPT_NAME'); + $filename = env('SCRIPT_FILENAME'); + $offset = 0; + if (!strpos($name, '.php')) { + $offset = 4; + } + return substr($filename, 0, strlen($filename) - (strlen($name) + $offset)); + break; + case 'PHP_SELF': + return str_replace(env('DOCUMENT_ROOT'), '', env('SCRIPT_FILENAME')); + break; + case 'CGI_MODE': + return (PHP_SAPI === 'cgi'); + break; + case 'HTTP_BASE': + $host = env('HTTP_HOST'); + $parts = explode('.', $host); + $count = count($parts); + + if ($count === 1) { + return '.' . $host; + } elseif ($count === 2) { + return '.' . $host; + } elseif ($count === 3) { + $gTLD = array('aero', 'asia', 'biz', 'cat', 'com', 'coop', 'edu', 'gov', 'info', 'int', 'jobs', 'mil', 'mobi', 'museum', 'name', 'net', 'org', 'pro', 'tel', 'travel', 'xxx'); + if (in_array($parts[1], $gTLD)) { + return '.' . $host; + } + } + array_shift($parts); + return '.' . implode('.', $parts); + break; + } + return null; + } +if (!function_exists('file_put_contents')) { + +/** + * Writes data into file. + * + * If file exists, it will be overwritten. If data is an array, it will be implode()ed with an empty string. + * + * @param string $fileName File name. + * @param mixed $data String or array. + * @return boolean Success + * @deprecated Will be removed in 2.0 + */ + function file_put_contents($fileName, $data) { + if (is_array($data)) { + $data = implode('', $data); + } + $res = @fopen($fileName, 'w+b'); + + if ($res) { + $write = @fwrite($res, $data); + if ($write === false) { + return false; + } else { + @fclose($res); + return $write; + } + } + return false; + } +} + +/** + * Reads/writes temporary data to cache files or session. + * + * @param string $path File path within /tmp to save the file. + * @param mixed $data The data to save to the temporary file. + * @param mixed $expires A valid strtotime string when the data expires. + * @param string $target The target of the cached data; either 'cache' or 'public'. + * @return mixed The contents of the temporary file. + * @deprecated Please use Cache::write() instead + */ + function cache($path, $data = null, $expires = '+1 day', $target = 'cache') { + if (Configure::read('Cache.disable')) { + return null; + } + $now = time(); + + if (!is_numeric($expires)) { + $expires = strtotime($expires, $now); + } + + switch (strtolower($target)) { + case 'cache': + $filename = CACHE . $path; + break; + case 'public': + $filename = WWW_ROOT . $path; + break; + case 'tmp': + $filename = TMP . $path; + break; + } + $timediff = $expires - $now; + $filetime = false; + + if (file_exists($filename)) { + $filetime = @filemtime($filename); + } + + if ($data === null) { + if (file_exists($filename) && $filetime !== false) { + if ($filetime + $timediff < $now) { + @unlink($filename); + } else { + $data = @file_get_contents($filename); + } + } + } elseif (is_writable(dirname($filename))) { + @file_put_contents($filename, $data); + } + return $data; + } + +/** + * Used to delete files in the cache directories, or clear contents of cache directories + * + * @param mixed $params As String name to be searched for deletion, if name is a directory all files in + * directory will be deleted. If array, names to be searched for deletion. If clearCache() without params, + * all files in app/tmp/cache/views will be deleted + * @param string $type Directory in tmp/cache defaults to view directory + * @param string $ext The file extension you are deleting + * @return true if files found and deleted false otherwise + */ + function clearCache($params = null, $type = 'views', $ext = '.php') { + if (is_string($params) || $params === null) { + $params = preg_replace('/\/\//', '/', $params); + $cache = CACHE . $type . DS . $params; + + if (is_file($cache . $ext)) { + @unlink($cache . $ext); + return true; + } elseif (is_dir($cache)) { + $files = glob($cache . '*'); + + if ($files === false) { + return false; + } + + foreach ($files as $file) { + if (is_file($file) && strrpos($file, DS . 'empty') !== strlen($file) - 6) { + @unlink($file); + } + } + return true; + } else { + $cache = array( + CACHE . $type . DS . '*' . $params . $ext, + CACHE . $type . DS . '*' . $params . '_*' . $ext + ); + $files = array(); + while ($search = array_shift($cache)) { + $results = glob($search); + if ($results !== false) { + $files = array_merge($files, $results); + } + } + if (empty($files)) { + return false; + } + foreach ($files as $file) { + if (is_file($file) && strrpos($file, DS . 'empty') !== strlen($file) - 6) { + @unlink($file); + } + } + return true; + } + } elseif (is_array($params)) { + foreach ($params as $file) { + clearCache($file, $type, $ext); + } + return true; + } + return false; + } + +/** + * Recursively strips slashes from all values in an array + * + * @param array $values Array of values to strip slashes + * @return mixed What is returned from calling stripslashes + * @link http://book.cakephp.org/view/1138/stripslashes_deep + */ + function stripslashes_deep($values) { + if (is_array($values)) { + foreach ($values as $key => $value) { + $values[$key] = stripslashes_deep($value); + } + } else { + $values = stripslashes($values); + } + return $values; + } + +/** + * Returns a translated string if one is found; Otherwise, the submitted message. + * + * @param string $singular Text to translate + * @param boolean $return Set to true to return translated string, or false to echo + * @return mixed translated string if $return is false string will be echoed + * @link http://book.cakephp.org/view/1121/__ + */ + function __($singular, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular); + } else { + return I18n::translate($singular); + } + } + +/** + * Returns correct plural form of message identified by $singular and $plural for count $count. + * Some languages have more than one form for plural messages dependent on the count. + * + * @param string $singular Singular text to translate + * @param string $plural Plural text + * @param integer $count Count + * @param boolean $return true to return, false to echo + * @return mixed plural form of translated string if $return is false string will be echoed + */ + function __n($singular, $plural, $count, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular, $plural, null, 6, $count); + } else { + return I18n::translate($singular, $plural, null, 6, $count); + } + } + +/** + * Allows you to override the current domain for a single message lookup. + * + * @param string $domain Domain + * @param string $msg String to translate + * @param string $return true to return, false to echo + * @return translated string if $return is false string will be echoed + */ + function __d($domain, $msg, $return = false) { + if (!$msg) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($msg, null, $domain); + } else { + return I18n::translate($msg, null, $domain); + } + } + +/** + * Allows you to override the current domain for a single plural message lookup. + * Returns correct plural form of message identified by $singular and $plural for count $count + * from domain $domain. + * + * @param string $domain Domain + * @param string $singular Singular string to translate + * @param string $plural Plural + * @param integer $count Count + * @param boolean $return true to return, false to echo + * @return plural form of translated string if $return is false string will be echoed + */ + function __dn($domain, $singular, $plural, $count, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular, $plural, $domain, 6, $count); + } else { + return I18n::translate($singular, $plural, $domain, 6, $count); + } + } + +/** + * Allows you to override the current domain for a single message lookup. + * It also allows you to specify a category. + * + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * + * - LC_ALL 0 + * - LC_COLLATE 1 + * - LC_CTYPE 2 + * - LC_MONETARY 3 + * - LC_NUMERIC 4 + * - LC_TIME 5 + * - LC_MESSAGES 6 + * + * @param string $domain Domain + * @param string $msg Message to translate + * @param integer $category Category + * @param boolean $return true to return, false to echo + * @return translated string if $return is false string will be echoed + */ + function __dc($domain, $msg, $category, $return = false) { + if (!$msg) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($msg, null, $domain, $category); + } else { + return I18n::translate($msg, null, $domain, $category); + } + } + +/** + * Allows you to override the current domain for a single plural message lookup. + * It also allows you to specify a category. + * Returns correct plural form of message identified by $singular and $plural for count $count + * from domain $domain. + * + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * + * - LC_ALL 0 + * - LC_COLLATE 1 + * - LC_CTYPE 2 + * - LC_MONETARY 3 + * - LC_NUMERIC 4 + * - LC_TIME 5 + * - LC_MESSAGES 6 + * + * @param string $domain Domain + * @param string $singular Singular string to translate + * @param string $plural Plural + * @param integer $count Count + * @param integer $category Category + * @param boolean $return true to return, false to echo + * @return plural form of translated string if $return is false string will be echoed + */ + function __dcn($domain, $singular, $plural, $count, $category, $return = false) { + if (!$singular) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($singular, $plural, $domain, $category, $count); + } else { + return I18n::translate($singular, $plural, $domain, $category, $count); + } + } + +/** + * The category argument allows a specific category of the locale settings to be used for fetching a message. + * Valid categories are: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL. + * + * Note that the category must be specified with a numeric value, instead of the constant name. The values are: + * + * - LC_ALL 0 + * - LC_COLLATE 1 + * - LC_CTYPE 2 + * - LC_MONETARY 3 + * - LC_NUMERIC 4 + * - LC_TIME 5 + * - LC_MESSAGES 6 + * + * @param string $msg String to translate + * @param integer $category Category + * @param string $return true to return, false to echo + * @return translated string if $return is false string will be echoed + */ + function __c($msg, $category, $return = false) { + if (!$msg) { + return; + } + if (!class_exists('I18n')) { + App::import('Core', 'i18n'); + } + + if ($return === false) { + echo I18n::translate($msg, null, null, $category); + } else { + return I18n::translate($msg, null, null, $category); + } + } + +/** + * Computes the difference of arrays using keys for comparison. + * + * @param array First array + * @param array Second array + * @return array Array with different keys + * @deprecated Will be removed in 2.0 + */ + if (!function_exists('array_diff_key')) { + function array_diff_key() { + $valuesDiff = array(); + + $argc = func_num_args(); + if ($argc < 2) { + return false; + } + + $args = func_get_args(); + foreach ($args as $param) { + if (!is_array($param)) { + return false; + } + } + + foreach ($args[0] as $valueKey => $valueData) { + for ($i = 1; $i < $argc; $i++) { + if (array_key_exists($valueKey, $args[$i])) { + continue 2; + } + } + $valuesDiff[$valueKey] = $valueData; + } + return $valuesDiff; + } + } + +/** + * Computes the intersection of arrays using keys for comparison + * + * @param array First array + * @param array Second array + * @return array Array with interesected keys + * @deprecated Will be removed in 2.0 + */ + if (!function_exists('array_intersect_key')) { + function array_intersect_key($arr1, $arr2) { + $res = array(); + foreach ($arr1 as $key => $value) { + if (array_key_exists($key, $arr2)) { + $res[$key] = $arr1[$key]; + } + } + return $res; + } + } + +/** + * Shortcut to Log::write. + * + * @param string $message Message to write to log + */ + function LogError($message) { + if (!class_exists('CakeLog')) { + App::import('Core', 'CakeLog'); + } + $bad = array("\n", "\r", "\t"); + $good = ' '; + CakeLog::write('error', str_replace($bad, $good, $message)); + } + +/** + * Searches include path for files. + * + * @param string $file File to look for + * @return Full path to file if exists, otherwise false + * @link http://book.cakephp.org/view/1131/fileExistsInPath + */ + function fileExistsInPath($file) { + $paths = explode(PATH_SEPARATOR, ini_get('include_path')); + foreach ($paths as $path) { + $fullPath = $path . DS . $file; + + if (file_exists($fullPath)) { + return $fullPath; + } elseif (file_exists($file)) { + return $file; + } + } + return false; + } + +/** + * Convert forward slashes to underscores and removes first and last underscores in a string + * + * @param string String to convert + * @return string with underscore remove from start and end of string + * @link http://book.cakephp.org/view/1126/convertSlash + */ + function convertSlash($string) { + $string = trim($string, '/'); + $string = preg_replace('/\/\//', '/', $string); + $string = str_replace('/', '_', $string); + return $string; + } + +/** + * Implements http_build_query for PHP4. + * + * @param string $data Data to set in query string + * @param string $prefix If numeric indices, prepend this to index for elements in base array. + * @param string $argSep String used to separate arguments + * @param string $baseKey Base key + * @return string URL encoded query string + * @see http://php.net/http_build_query + * @deprecated Will be removed in 2.0 + */ + if (!function_exists('http_build_query')) { + function http_build_query($data, $prefix = null, $argSep = null, $baseKey = null) { + if (empty($argSep)) { + $argSep = ini_get('arg_separator.output'); + } + if (is_object($data)) { + $data = get_object_vars($data); + } + $out = array(); + + foreach ((array)$data as $key => $v) { + if (is_numeric($key) && !empty($prefix)) { + $key = $prefix . $key; + } + $key = urlencode($key); + + if (!empty($baseKey)) { + $key = $baseKey . '[' . $key . ']'; + } + + if (is_array($v) || is_object($v)) { + $out[] = http_build_query($v, $prefix, $argSep, $key); + } else { + $out[] = $key . '=' . urlencode($v); + } + } + return implode($argSep, $out); + } + } + +/** + * Wraps ternary operations. If $condition is a non-empty value, $val1 is returned, otherwise $val2. + * Don't use for isset() conditions, or wrap your variable with @ operator: + * Example: + * + * `ife(isset($variable), @$variable, 'default');` + * + * @param mixed $condition Conditional expression + * @param mixed $val1 Value to return in case condition matches + * @param mixed $val2 Value to return if condition doesn't match + * @return mixed $val1 or $val2, depending on whether $condition evaluates to a non-empty expression. + * @link http://book.cakephp.org/view/1133/ife + * @deprecated Will be removed in 2.0 + */ + function ife($condition, $val1 = null, $val2 = null) { + if (!empty($condition)) { + return $val1; + } + return $val2; + } diff --git a/code/ryzom/tools/server/www/webtt/cake/bootstrap.php b/code/ryzom/tools/server/www/webtt/cake/bootstrap.php new file mode 100644 index 000000000..b69cb7b75 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/bootstrap.php @@ -0,0 +1,39 @@ += 5)); +} +if (!defined('E_DEPRECATED')) { + define('E_DEPRECATED', 8192); +} +error_reporting(E_ALL & ~E_DEPRECATED); + +require CORE_PATH . 'cake' . DS . 'basics.php'; +$TIME_START = getMicrotime(); +require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php'; +require LIBS . 'object.php'; +require LIBS . 'inflector.php'; +require LIBS . 'configure.php'; +require LIBS . 'set.php'; +require LIBS . 'cache.php'; +Configure::getInstance(); +require CAKE . 'dispatcher.php'; diff --git a/code/ryzom/tools/server/www/webtt/cake/config/config.php b/code/ryzom/tools/server/www/webtt/cake/config/config.php new file mode 100644 index 000000000..8c4ab11b9 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/config.php @@ -0,0 +1,20 @@ + 181, 'status' => 'C', 'lower' => array(956)); +$config['0080_00ff'][] = array('upper' => 924, 'status' => 'C', 'lower' => array(181)); +$config['0080_00ff'][] = array('upper' => 192, 'status' => 'C', 'lower' => array(224)); /* LATIN CAPITAL LETTER A WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 193, 'status' => 'C', 'lower' => array(225)); /* LATIN CAPITAL LETTER A WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 194, 'status' => 'C', 'lower' => array(226)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 195, 'status' => 'C', 'lower' => array(227)); /* LATIN CAPITAL LETTER A WITH TILDE */ +$config['0080_00ff'][] = array('upper' => 196, 'status' => 'C', 'lower' => array(228)); /* LATIN CAPITAL LETTER A WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 197, 'status' => 'C', 'lower' => array(229)); /* LATIN CAPITAL LETTER A WITH RING ABOVE */ +$config['0080_00ff'][] = array('upper' => 198, 'status' => 'C', 'lower' => array(230)); /* LATIN CAPITAL LETTER AE */ +$config['0080_00ff'][] = array('upper' => 199, 'status' => 'C', 'lower' => array(231)); /* LATIN CAPITAL LETTER C WITH CEDILLA */ +$config['0080_00ff'][] = array('upper' => 200, 'status' => 'C', 'lower' => array(232)); /* LATIN CAPITAL LETTER E WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 201, 'status' => 'C', 'lower' => array(233)); /* LATIN CAPITAL LETTER E WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 202, 'status' => 'C', 'lower' => array(234)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 203, 'status' => 'C', 'lower' => array(235)); /* LATIN CAPITAL LETTER E WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 204, 'status' => 'C', 'lower' => array(236)); /* LATIN CAPITAL LETTER I WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 205, 'status' => 'C', 'lower' => array(237)); /* LATIN CAPITAL LETTER I WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 206, 'status' => 'C', 'lower' => array(238)); /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 207, 'status' => 'C', 'lower' => array(239)); /* LATIN CAPITAL LETTER I WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 208, 'status' => 'C', 'lower' => array(240)); /* LATIN CAPITAL LETTER ETH */ +$config['0080_00ff'][] = array('upper' => 209, 'status' => 'C', 'lower' => array(241)); /* LATIN CAPITAL LETTER N WITH TILDE */ +$config['0080_00ff'][] = array('upper' => 210, 'status' => 'C', 'lower' => array(242)); /* LATIN CAPITAL LETTER O WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 211, 'status' => 'C', 'lower' => array(243)); /* LATIN CAPITAL LETTER O WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 212, 'status' => 'C', 'lower' => array(244)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 213, 'status' => 'C', 'lower' => array(245)); /* LATIN CAPITAL LETTER O WITH TILDE */ +$config['0080_00ff'][] = array('upper' => 214, 'status' => 'C', 'lower' => array(246)); /* LATIN CAPITAL LETTER O WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 216, 'status' => 'C', 'lower' => array(248)); /* LATIN CAPITAL LETTER O WITH STROKE */ +$config['0080_00ff'][] = array('upper' => 217, 'status' => 'C', 'lower' => array(249)); /* LATIN CAPITAL LETTER U WITH GRAVE */ +$config['0080_00ff'][] = array('upper' => 218, 'status' => 'C', 'lower' => array(250)); /* LATIN CAPITAL LETTER U WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 219, 'status' => 'C', 'lower' => array(251)); /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ +$config['0080_00ff'][] = array('upper' => 220, 'status' => 'C', 'lower' => array(252)); /* LATIN CAPITAL LETTER U WITH DIAERESIS */ +$config['0080_00ff'][] = array('upper' => 221, 'status' => 'C', 'lower' => array(253)); /* LATIN CAPITAL LETTER Y WITH ACUTE */ +$config['0080_00ff'][] = array('upper' => 222, 'status' => 'C', 'lower' => array(254)); /* LATIN CAPITAL LETTER THORN */ +$config['0080_00ff'][] = array('upper' => 223, 'status' => 'F', 'lower' => array(115, 115)); /* LATIN SMALL LETTER SHARP S */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0100_017f.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0100_017f.php new file mode 100644 index 000000000..35a9f03da --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0100_017f.php @@ -0,0 +1,107 @@ + 256, 'status' => 'C', 'lower' => array(257)); /* LATIN CAPITAL LETTER A WITH MACRON */ +$config['0100_017f'][] = array('upper' => 258, 'status' => 'C', 'lower' => array(259)); /* LATIN CAPITAL LETTER A WITH BREVE */ +$config['0100_017f'][] = array('upper' => 260, 'status' => 'C', 'lower' => array(261)); /* LATIN CAPITAL LETTER A WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 262, 'status' => 'C', 'lower' => array(263)); /* LATIN CAPITAL LETTER C WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 264, 'status' => 'C', 'lower' => array(265)); /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 266, 'status' => 'C', 'lower' => array(267)); /* LATIN CAPITAL LETTER C WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 268, 'status' => 'C', 'lower' => array(269)); /* LATIN CAPITAL LETTER C WITH CARON */ +$config['0100_017f'][] = array('upper' => 270, 'status' => 'C', 'lower' => array(271)); /* LATIN CAPITAL LETTER D WITH CARON */ +$config['0100_017f'][] = array('upper' => 272, 'status' => 'C', 'lower' => array(273)); /* LATIN CAPITAL LETTER D WITH STROKE */ +$config['0100_017f'][] = array('upper' => 274, 'status' => 'C', 'lower' => array(275)); /* LATIN CAPITAL LETTER E WITH MACRON */ +$config['0100_017f'][] = array('upper' => 276, 'status' => 'C', 'lower' => array(277)); /* LATIN CAPITAL LETTER E WITH BREVE */ +$config['0100_017f'][] = array('upper' => 278, 'status' => 'C', 'lower' => array(279)); /* LATIN CAPITAL LETTER E WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 280, 'status' => 'C', 'lower' => array(281)); /* LATIN CAPITAL LETTER E WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 282, 'status' => 'C', 'lower' => array(283)); /* LATIN CAPITAL LETTER E WITH CARON */ +$config['0100_017f'][] = array('upper' => 284, 'status' => 'C', 'lower' => array(285)); /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 286, 'status' => 'C', 'lower' => array(287)); /* LATIN CAPITAL LETTER G WITH BREVE */ +$config['0100_017f'][] = array('upper' => 288, 'status' => 'C', 'lower' => array(289)); /* LATIN CAPITAL LETTER G WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 290, 'status' => 'C', 'lower' => array(291)); /* LATIN CAPITAL LETTER G WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 292, 'status' => 'C', 'lower' => array(293)); /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 294, 'status' => 'C', 'lower' => array(295)); /* LATIN CAPITAL LETTER H WITH STROKE */ +$config['0100_017f'][] = array('upper' => 296, 'status' => 'C', 'lower' => array(297)); /* LATIN CAPITAL LETTER I WITH TILDE */ +$config['0100_017f'][] = array('upper' => 298, 'status' => 'C', 'lower' => array(299)); /* LATIN CAPITAL LETTER I WITH MACRON */ +$config['0100_017f'][] = array('upper' => 300, 'status' => 'C', 'lower' => array(301)); /* LATIN CAPITAL LETTER I WITH BREVE */ +$config['0100_017f'][] = array('upper' => 302, 'status' => 'C', 'lower' => array(303)); /* LATIN CAPITAL LETTER I WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 304, 'status' => 'F', 'lower' => array(105, 775)); /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 304, 'status' => 'T', 'lower' => array(105)); /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 306, 'status' => 'C', 'lower' => array(307)); /* LATIN CAPITAL LIGATURE IJ */ +$config['0100_017f'][] = array('upper' => 308, 'status' => 'C', 'lower' => array(309)); /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 310, 'status' => 'C', 'lower' => array(311)); /* LATIN CAPITAL LETTER K WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 313, 'status' => 'C', 'lower' => array(314)); /* LATIN CAPITAL LETTER L WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 315, 'status' => 'C', 'lower' => array(316)); /* LATIN CAPITAL LETTER L WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 317, 'status' => 'C', 'lower' => array(318)); /* LATIN CAPITAL LETTER L WITH CARON */ +$config['0100_017f'][] = array('upper' => 319, 'status' => 'C', 'lower' => array(320)); /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */ +$config['0100_017f'][] = array('upper' => 321, 'status' => 'C', 'lower' => array(322)); /* LATIN CAPITAL LETTER L WITH STROKE */ +$config['0100_017f'][] = array('upper' => 323, 'status' => 'C', 'lower' => array(324)); /* LATIN CAPITAL LETTER N WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 325, 'status' => 'C', 'lower' => array(326)); /* LATIN CAPITAL LETTER N WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 327, 'status' => 'C', 'lower' => array(328)); /* LATIN CAPITAL LETTER N WITH CARON */ +$config['0100_017f'][] = array('upper' => 329, 'status' => 'F', 'lower' => array(700, 110)); /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */ +$config['0100_017f'][] = array('upper' => 330, 'status' => 'C', 'lower' => array(331)); /* LATIN CAPITAL LETTER ENG */ +$config['0100_017f'][] = array('upper' => 332, 'status' => 'C', 'lower' => array(333)); /* LATIN CAPITAL LETTER O WITH MACRON */ +$config['0100_017f'][] = array('upper' => 334, 'status' => 'C', 'lower' => array(335)); /* LATIN CAPITAL LETTER O WITH BREVE */ +$config['0100_017f'][] = array('upper' => 336, 'status' => 'C', 'lower' => array(337)); /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ +$config['0100_017f'][] = array('upper' => 338, 'status' => 'C', 'lower' => array(339)); /* LATIN CAPITAL LIGATURE OE */ +$config['0100_017f'][] = array('upper' => 340, 'status' => 'C', 'lower' => array(341)); /* LATIN CAPITAL LETTER R WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 342, 'status' => 'C', 'lower' => array(343)); /* LATIN CAPITAL LETTER R WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 344, 'status' => 'C', 'lower' => array(345)); /* LATIN CAPITAL LETTER R WITH CARON */ +$config['0100_017f'][] = array('upper' => 346, 'status' => 'C', 'lower' => array(347)); /* LATIN CAPITAL LETTER S WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 348, 'status' => 'C', 'lower' => array(349)); /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 350, 'status' => 'C', 'lower' => array(351)); /* LATIN CAPITAL LETTER S WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 352, 'status' => 'C', 'lower' => array(353)); /* LATIN CAPITAL LETTER S WITH CARON */ +$config['0100_017f'][] = array('upper' => 354, 'status' => 'C', 'lower' => array(355)); /* LATIN CAPITAL LETTER T WITH CEDILLA */ +$config['0100_017f'][] = array('upper' => 356, 'status' => 'C', 'lower' => array(357)); /* LATIN CAPITAL LETTER T WITH CARON */ +$config['0100_017f'][] = array('upper' => 358, 'status' => 'C', 'lower' => array(359)); /* LATIN CAPITAL LETTER T WITH STROKE */ +$config['0100_017f'][] = array('upper' => 360, 'status' => 'C', 'lower' => array(361)); /* LATIN CAPITAL LETTER U WITH TILDE */ +$config['0100_017f'][] = array('upper' => 362, 'status' => 'C', 'lower' => array(363)); /* LATIN CAPITAL LETTER U WITH MACRON */ +$config['0100_017f'][] = array('upper' => 364, 'status' => 'C', 'lower' => array(365)); /* LATIN CAPITAL LETTER U WITH BREVE */ +$config['0100_017f'][] = array('upper' => 366, 'status' => 'C', 'lower' => array(367)); /* LATIN CAPITAL LETTER U WITH RING ABOVE */ +$config['0100_017f'][] = array('upper' => 368, 'status' => 'C', 'lower' => array(369)); /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ +$config['0100_017f'][] = array('upper' => 370, 'status' => 'C', 'lower' => array(371)); /* LATIN CAPITAL LETTER U WITH OGONEK */ +$config['0100_017f'][] = array('upper' => 372, 'status' => 'C', 'lower' => array(373)); /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 374, 'status' => 'C', 'lower' => array(375)); /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ +$config['0100_017f'][] = array('upper' => 376, 'status' => 'C', 'lower' => array(255)); /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ +$config['0100_017f'][] = array('upper' => 377, 'status' => 'C', 'lower' => array(378)); /* LATIN CAPITAL LETTER Z WITH ACUTE */ +$config['0100_017f'][] = array('upper' => 379, 'status' => 'C', 'lower' => array(380)); /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */ +$config['0100_017f'][] = array('upper' => 381, 'status' => 'C', 'lower' => array(382)); /* LATIN CAPITAL LETTER Z WITH CARON */ +$config['0100_017f'][] = array('upper' => 383, 'status' => 'C', 'lower' => array(115)); /* LATIN SMALL LETTER LONG S */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0180_024F.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0180_024F.php new file mode 100644 index 000000000..1148ccc94 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0180_024F.php @@ -0,0 +1,149 @@ + 385, 'status' => 'C', 'lower' => array(595)); /* LATIN CAPITAL LETTER B WITH HOOK */ +$config['0180_024F'][] = array('upper' => 386, 'status' => 'C', 'lower' => array(387)); /* LATIN CAPITAL LETTER B WITH TOPBAR */ +$config['0180_024F'][] = array('upper' => 388, 'status' => 'C', 'lower' => array(389)); /* LATIN CAPITAL LETTER TONE SIX */ +$config['0180_024F'][] = array('upper' => 390, 'status' => 'C', 'lower' => array(596)); /* LATIN CAPITAL LETTER OPEN O */ +$config['0180_024F'][] = array('upper' => 391, 'status' => 'C', 'lower' => array(392)); /* LATIN CAPITAL LETTER C WITH HOOK */ +$config['0180_024F'][] = array('upper' => 393, 'status' => 'C', 'lower' => array(598)); /* LATIN CAPITAL LETTER AFRICAN D */ +$config['0180_024F'][] = array('upper' => 394, 'status' => 'C', 'lower' => array(599)); /* LATIN CAPITAL LETTER D WITH HOOK */ +$config['0180_024F'][] = array('upper' => 395, 'status' => 'C', 'lower' => array(396)); /* LATIN CAPITAL LETTER D WITH TOPBAR */ +$config['0180_024F'][] = array('upper' => 398, 'status' => 'C', 'lower' => array(477)); /* LATIN CAPITAL LETTER REVERSED E */ +$config['0180_024F'][] = array('upper' => 399, 'status' => 'C', 'lower' => array(601)); /* LATIN CAPITAL LETTER SCHWA */ +$config['0180_024F'][] = array('upper' => 400, 'status' => 'C', 'lower' => array(603)); /* LATIN CAPITAL LETTER OPEN E */ +$config['0180_024F'][] = array('upper' => 401, 'status' => 'C', 'lower' => array(402)); /* LATIN CAPITAL LETTER F WITH HOOK */ +$config['0180_024F'][] = array('upper' => 403, 'status' => 'C', 'lower' => array(608)); /* LATIN CAPITAL LETTER G WITH HOOK */ +$config['0180_024F'][] = array('upper' => 404, 'status' => 'C', 'lower' => array(611)); /* LATIN CAPITAL LETTER GAMMA */ +$config['0180_024F'][] = array('upper' => 406, 'status' => 'C', 'lower' => array(617)); /* LATIN CAPITAL LETTER IOTA */ +$config['0180_024F'][] = array('upper' => 407, 'status' => 'C', 'lower' => array(616)); /* LATIN CAPITAL LETTER I WITH STROKE */ +$config['0180_024F'][] = array('upper' => 408, 'status' => 'C', 'lower' => array(409)); /* LATIN CAPITAL LETTER K WITH HOOK */ +$config['0180_024F'][] = array('upper' => 412, 'status' => 'C', 'lower' => array(623)); /* LATIN CAPITAL LETTER TURNED M */ +$config['0180_024F'][] = array('upper' => 413, 'status' => 'C', 'lower' => array(626)); /* LATIN CAPITAL LETTER N WITH LEFT HOOK */ +$config['0180_024F'][] = array('upper' => 415, 'status' => 'C', 'lower' => array(629)); /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ +$config['0180_024F'][] = array('upper' => 416, 'status' => 'C', 'lower' => array(417)); /* LATIN CAPITAL LETTER O WITH HORN */ +$config['0180_024F'][] = array('upper' => 418, 'status' => 'C', 'lower' => array(419)); /* LATIN CAPITAL LETTER OI */ +$config['0180_024F'][] = array('upper' => 420, 'status' => 'C', 'lower' => array(421)); /* LATIN CAPITAL LETTER P WITH HOOK */ +$config['0180_024F'][] = array('upper' => 422, 'status' => 'C', 'lower' => array(640)); /* LATIN LETTER YR */ +$config['0180_024F'][] = array('upper' => 423, 'status' => 'C', 'lower' => array(424)); /* LATIN CAPITAL LETTER TONE TWO */ +$config['0180_024F'][] = array('upper' => 425, 'status' => 'C', 'lower' => array(643)); /* LATIN CAPITAL LETTER ESH */ +$config['0180_024F'][] = array('upper' => 428, 'status' => 'C', 'lower' => array(429)); /* LATIN CAPITAL LETTER T WITH HOOK */ +$config['0180_024F'][] = array('upper' => 430, 'status' => 'C', 'lower' => array(648)); /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK */ +$config['0180_024F'][] = array('upper' => 431, 'status' => 'C', 'lower' => array(432)); /* LATIN CAPITAL LETTER U WITH HORN */ +$config['0180_024F'][] = array('upper' => 433, 'status' => 'C', 'lower' => array(650)); /* LATIN CAPITAL LETTER UPSILON */ +$config['0180_024F'][] = array('upper' => 434, 'status' => 'C', 'lower' => array(651)); /* LATIN CAPITAL LETTER V WITH HOOK */ +$config['0180_024F'][] = array('upper' => 435, 'status' => 'C', 'lower' => array(436)); /* LATIN CAPITAL LETTER Y WITH HOOK */ +$config['0180_024F'][] = array('upper' => 437, 'status' => 'C', 'lower' => array(438)); /* LATIN CAPITAL LETTER Z WITH STROKE */ +$config['0180_024F'][] = array('upper' => 439, 'status' => 'C', 'lower' => array(658)); /* LATIN CAPITAL LETTER EZH */ +$config['0180_024F'][] = array('upper' => 440, 'status' => 'C', 'lower' => array(441)); /* LATIN CAPITAL LETTER EZH REVERSED */ +$config['0180_024F'][] = array('upper' => 444, 'status' => 'C', 'lower' => array(445)); /* LATIN CAPITAL LETTER TONE FIVE */ +$config['0180_024F'][] = array('upper' => 452, 'status' => 'C', 'lower' => array(454)); /* LATIN CAPITAL LETTER DZ WITH CARON */ +$config['0180_024F'][] = array('upper' => 453, 'status' => 'C', 'lower' => array(454)); /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON */ +$config['0180_024F'][] = array('upper' => 455, 'status' => 'C', 'lower' => array(457)); /* LATIN CAPITAL LETTER LJ */ +$config['0180_024F'][] = array('upper' => 456, 'status' => 'C', 'lower' => array(457)); /* LATIN CAPITAL LETTER L WITH SMALL LETTER J */ +$config['0180_024F'][] = array('upper' => 458, 'status' => 'C', 'lower' => array(460)); /* LATIN CAPITAL LETTER NJ */ +$config['0180_024F'][] = array('upper' => 459, 'status' => 'C', 'lower' => array(460)); /* LATIN CAPITAL LETTER N WITH SMALL LETTER J */ +$config['0180_024F'][] = array('upper' => 461, 'status' => 'C', 'lower' => array(462)); /* LATIN CAPITAL LETTER A WITH CARON */ +$config['0180_024F'][] = array('upper' => 463, 'status' => 'C', 'lower' => array(464)); /* LATIN CAPITAL LETTER I WITH CARON */ +$config['0180_024F'][] = array('upper' => 465, 'status' => 'C', 'lower' => array(466)); /* LATIN CAPITAL LETTER O WITH CARON */ +$config['0180_024F'][] = array('upper' => 467, 'status' => 'C', 'lower' => array(468)); /* LATIN CAPITAL LETTER U WITH CARON */ +$config['0180_024F'][] = array('upper' => 469, 'status' => 'C', 'lower' => array(470)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON */ +$config['0180_024F'][] = array('upper' => 471, 'status' => 'C', 'lower' => array(472)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE */ +$config['0180_024F'][] = array('upper' => 473, 'status' => 'C', 'lower' => array(474)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON */ +$config['0180_024F'][] = array('upper' => 475, 'status' => 'C', 'lower' => array(476)); /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE */ +$config['0180_024F'][] = array('upper' => 478, 'status' => 'C', 'lower' => array(479)); /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */ +$config['0180_024F'][] = array('upper' => 480, 'status' => 'C', 'lower' => array(481)); /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON */ +$config['0180_024F'][] = array('upper' => 482, 'status' => 'C', 'lower' => array(483)); /* LATIN CAPITAL LETTER AE WITH MACRON */ +$config['0180_024F'][] = array('upper' => 484, 'status' => 'C', 'lower' => array(485)); /* LATIN CAPITAL LETTER G WITH STROKE */ +$config['0180_024F'][] = array('upper' => 486, 'status' => 'C', 'lower' => array(487)); /* LATIN CAPITAL LETTER G WITH CARON */ +$config['0180_024F'][] = array('upper' => 488, 'status' => 'C', 'lower' => array(489)); /* LATIN CAPITAL LETTER K WITH CARON */ +$config['0180_024F'][] = array('upper' => 490, 'status' => 'C', 'lower' => array(491)); /* LATIN CAPITAL LETTER O WITH OGONEK */ +$config['0180_024F'][] = array('upper' => 492, 'status' => 'C', 'lower' => array(493)); /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON */ +$config['0180_024F'][] = array('upper' => 494, 'status' => 'C', 'lower' => array(495)); /* LATIN CAPITAL LETTER EZH WITH CARON */ +$config['0180_024F'][] = array('upper' => 496, 'status' => 'F', 'lower' => array(106, 780)); /* LATIN SMALL LETTER J WITH CARON */ +$config['0180_024F'][] = array('upper' => 497, 'status' => 'C', 'lower' => array(499)); /* LATIN CAPITAL LETTER DZ */ +$config['0180_024F'][] = array('upper' => 498, 'status' => 'C', 'lower' => array(499)); /* LATIN CAPITAL LETTER D WITH SMALL LETTER Z */ +$config['0180_024F'][] = array('upper' => 500, 'status' => 'C', 'lower' => array(501)); /* LATIN CAPITAL LETTER G WITH ACUTE */ +$config['0180_024F'][] = array('upper' => 502, 'status' => 'C', 'lower' => array(405)); /* LATIN CAPITAL LETTER HWAIR */ +$config['0180_024F'][] = array('upper' => 503, 'status' => 'C', 'lower' => array(447)); /* LATIN CAPITAL LETTER WYNN */ +$config['0180_024F'][] = array('upper' => 504, 'status' => 'C', 'lower' => array(505)); /* LATIN CAPITAL LETTER N WITH GRAVE */ +$config['0180_024F'][] = array('upper' => 506, 'status' => 'C', 'lower' => array(507)); /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */ +$config['0180_024F'][] = array('upper' => 508, 'status' => 'C', 'lower' => array(509)); /* LATIN CAPITAL LETTER AE WITH ACUTE */ +$config['0180_024F'][] = array('upper' => 510, 'status' => 'C', 'lower' => array(511)); /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */ +$config['0180_024F'][] = array('upper' => 512, 'status' => 'C', 'lower' => array(513)); /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 514, 'status' => 'C', 'lower' => array(515)); /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 516, 'status' => 'C', 'lower' => array(517)); /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 518, 'status' => 'C', 'lower' => array(519)); /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 520, 'status' => 'C', 'lower' => array(521)); /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 522, 'status' => 'C', 'lower' => array(523)); /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 524, 'status' => 'C', 'lower' => array(525)); /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 526, 'status' => 'C', 'lower' => array(527)); /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 528, 'status' => 'C', 'lower' => array(529)); /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 530, 'status' => 'C', 'lower' => array(531)); /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 532, 'status' => 'C', 'lower' => array(533)); /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */ +$config['0180_024F'][] = array('upper' => 534, 'status' => 'C', 'lower' => array(535)); /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */ +$config['0180_024F'][] = array('upper' => 536, 'status' => 'C', 'lower' => array(537)); /* LATIN CAPITAL LETTER S WITH COMMA BELOW */ +$config['0180_024F'][] = array('upper' => 538, 'status' => 'C', 'lower' => array(539)); /* LATIN CAPITAL LETTER T WITH COMMA BELOW */ +$config['0180_024F'][] = array('upper' => 540, 'status' => 'C', 'lower' => array(541)); /* LATIN CAPITAL LETTER YOGH */ +$config['0180_024F'][] = array('upper' => 542, 'status' => 'C', 'lower' => array(543)); /* LATIN CAPITAL LETTER H WITH CARON */ +$config['0180_024F'][] = array('upper' => 544, 'status' => 'C', 'lower' => array(414)); /* LATIN CAPITAL LETTER N WITH LONG RIGHT LEG */ +$config['0180_024F'][] = array('upper' => 546, 'status' => 'C', 'lower' => array(547)); /* LATIN CAPITAL LETTER OU */ +$config['0180_024F'][] = array('upper' => 548, 'status' => 'C', 'lower' => array(549)); /* LATIN CAPITAL LETTER Z WITH HOOK */ +$config['0180_024F'][] = array('upper' => 550, 'status' => 'C', 'lower' => array(551)); /* LATIN CAPITAL LETTER A WITH DOT ABOVE */ +$config['0180_024F'][] = array('upper' => 552, 'status' => 'C', 'lower' => array(553)); /* LATIN CAPITAL LETTER E WITH CEDILLA */ +$config['0180_024F'][] = array('upper' => 554, 'status' => 'C', 'lower' => array(555)); /* LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON */ +$config['0180_024F'][] = array('upper' => 556, 'status' => 'C', 'lower' => array(557)); /* LATIN CAPITAL LETTER O WITH TILDE AND MACRON */ +$config['0180_024F'][] = array('upper' => 558, 'status' => 'C', 'lower' => array(559)); /* LATIN CAPITAL LETTER O WITH DOT ABOVE */ +$config['0180_024F'][] = array('upper' => 560, 'status' => 'C', 'lower' => array(561)); /* LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON */ +$config['0180_024F'][] = array('upper' => 562, 'status' => 'C', 'lower' => array(563)); /* LATIN CAPITAL LETTER Y WITH MACRON */ +$config['0180_024F'][] = array('upper' => 570, 'status' => 'C', 'lower' => array(11365)); /* LATIN CAPITAL LETTER A WITH STROKE */ +$config['0180_024F'][] = array('upper' => 571, 'status' => 'C', 'lower' => array(572)); /* LATIN CAPITAL LETTER C WITH STROKE */ +$config['0180_024F'][] = array('upper' => 573, 'status' => 'C', 'lower' => array(410)); /* LATIN CAPITAL LETTER L WITH BAR */ +$config['0180_024F'][] = array('upper' => 574, 'status' => 'C', 'lower' => array(11366)); /* LATIN CAPITAL LETTER T WITH DIAGONAL STROKE */ +$config['0180_024F'][] = array('upper' => 577, 'status' => 'C', 'lower' => array(578)); /* LATIN CAPITAL LETTER GLOTTAL STOP */ +$config['0180_024F'][] = array('upper' => 579, 'status' => 'C', 'lower' => array(384)); /* LATIN CAPITAL LETTER B WITH STROKE */ +$config['0180_024F'][] = array('upper' => 580, 'status' => 'C', 'lower' => array(649)); /* LATIN CAPITAL LETTER U BAR */ +$config['0180_024F'][] = array('upper' => 581, 'status' => 'C', 'lower' => array(652)); /* LATIN CAPITAL LETTER TURNED V */ +$config['0180_024F'][] = array('upper' => 582, 'status' => 'C', 'lower' => array(583)); /* LATIN CAPITAL LETTER E WITH STROKE */ +$config['0180_024F'][] = array('upper' => 584, 'status' => 'C', 'lower' => array(585)); /* LATIN CAPITAL LETTER J WITH STROKE */ +$config['0180_024F'][] = array('upper' => 586, 'status' => 'C', 'lower' => array(587)); /* LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL */ +$config['0180_024F'][] = array('upper' => 588, 'status' => 'C', 'lower' => array(589)); /* LATIN CAPITAL LETTER R WITH STROKE */ +$config['0180_024F'][] = array('upper' => 590, 'status' => 'C', 'lower' => array(591)); /* LATIN CAPITAL LETTER Y WITH STROKE */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0250_02af.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0250_02af.php new file mode 100644 index 000000000..0472e297c --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0250_02af.php @@ -0,0 +1,42 @@ + 422, 'status' => 'C', 'lower' => array(640)); diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0370_03ff.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0370_03ff.php new file mode 100644 index 000000000..90defe832 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0370_03ff.php @@ -0,0 +1,103 @@ + 902, 'status' => 'C', 'lower' => array(940)); /* GREEK CAPITAL LETTER ALPHA WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 904, 'status' => 'C', 'lower' => array(941)); /* GREEK CAPITAL LETTER EPSILON WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 905, 'status' => 'C', 'lower' => array(942)); /* GREEK CAPITAL LETTER ETA WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 906, 'status' => 'C', 'lower' => array(943)); /* GREEK CAPITAL LETTER IOTA WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 908, 'status' => 'C', 'lower' => array(972)); /* GREEK CAPITAL LETTER OMICRON WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 910, 'status' => 'C', 'lower' => array(973)); /* GREEK CAPITAL LETTER UPSILON WITH TONOS */ +$config['0370_03ff'][] = array('upper' => 911, 'status' => 'C', 'lower' => array(974)); /* GREEK CAPITAL LETTER OMEGA WITH TONOS */ +//$config['0370_03ff'][] = array('upper' => 912, 'status' => 'F', 'lower' => array(953, 776, 769)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ +$config['0370_03ff'][] = array('upper' => 913, 'status' => 'C', 'lower' => array(945)); /* GREEK CAPITAL LETTER ALPHA */ +$config['0370_03ff'][] = array('upper' => 914, 'status' => 'C', 'lower' => array(946)); /* GREEK CAPITAL LETTER BETA */ +$config['0370_03ff'][] = array('upper' => 915, 'status' => 'C', 'lower' => array(947)); /* GREEK CAPITAL LETTER GAMMA */ +$config['0370_03ff'][] = array('upper' => 916, 'status' => 'C', 'lower' => array(948)); /* GREEK CAPITAL LETTER DELTA */ +$config['0370_03ff'][] = array('upper' => 917, 'status' => 'C', 'lower' => array(949)); /* GREEK CAPITAL LETTER EPSILON */ +$config['0370_03ff'][] = array('upper' => 918, 'status' => 'C', 'lower' => array(950)); /* GREEK CAPITAL LETTER ZETA */ +$config['0370_03ff'][] = array('upper' => 919, 'status' => 'C', 'lower' => array(951)); /* GREEK CAPITAL LETTER ETA */ +$config['0370_03ff'][] = array('upper' => 920, 'status' => 'C', 'lower' => array(952)); /* GREEK CAPITAL LETTER THETA */ +$config['0370_03ff'][] = array('upper' => 921, 'status' => 'C', 'lower' => array(953)); /* GREEK CAPITAL LETTER IOTA */ +$config['0370_03ff'][] = array('upper' => 922, 'status' => 'C', 'lower' => array(954)); /* GREEK CAPITAL LETTER KAPPA */ +$config['0370_03ff'][] = array('upper' => 923, 'status' => 'C', 'lower' => array(955)); /* GREEK CAPITAL LETTER LAMDA */ +$config['0370_03ff'][] = array('upper' => 924, 'status' => 'C', 'lower' => array(956)); /* GREEK CAPITAL LETTER MU */ +$config['0370_03ff'][] = array('upper' => 925, 'status' => 'C', 'lower' => array(957)); /* GREEK CAPITAL LETTER NU */ +$config['0370_03ff'][] = array('upper' => 926, 'status' => 'C', 'lower' => array(958)); /* GREEK CAPITAL LETTER XI */ +$config['0370_03ff'][] = array('upper' => 927, 'status' => 'C', 'lower' => array(959)); /* GREEK CAPITAL LETTER OMICRON */ +$config['0370_03ff'][] = array('upper' => 928, 'status' => 'C', 'lower' => array(960)); /* GREEK CAPITAL LETTER PI */ +$config['0370_03ff'][] = array('upper' => 929, 'status' => 'C', 'lower' => array(961)); /* GREEK CAPITAL LETTER RHO */ +$config['0370_03ff'][] = array('upper' => 931, 'status' => 'C', 'lower' => array(963)); /* GREEK CAPITAL LETTER SIGMA */ +$config['0370_03ff'][] = array('upper' => 932, 'status' => 'C', 'lower' => array(964)); /* GREEK CAPITAL LETTER TAU */ +$config['0370_03ff'][] = array('upper' => 933, 'status' => 'C', 'lower' => array(965)); /* GREEK CAPITAL LETTER UPSILON */ +$config['0370_03ff'][] = array('upper' => 934, 'status' => 'C', 'lower' => array(966)); /* GREEK CAPITAL LETTER PHI */ +$config['0370_03ff'][] = array('upper' => 935, 'status' => 'C', 'lower' => array(967)); /* GREEK CAPITAL LETTER CHI */ +$config['0370_03ff'][] = array('upper' => 936, 'status' => 'C', 'lower' => array(968)); /* GREEK CAPITAL LETTER PSI */ +$config['0370_03ff'][] = array('upper' => 937, 'status' => 'C', 'lower' => array(969)); /* GREEK CAPITAL LETTER OMEGA */ +$config['0370_03ff'][] = array('upper' => 938, 'status' => 'C', 'lower' => array(970)); /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ +$config['0370_03ff'][] = array('upper' => 939, 'status' => 'C', 'lower' => array(971)); /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ +$config['0370_03ff'][] = array('upper' => 944, 'status' => 'F', 'lower' => array(965, 776, 769)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ +$config['0370_03ff'][] = array('upper' => 962, 'status' => 'C', 'lower' => array(963)); /* GREEK SMALL LETTER FINAL SIGMA */ +$config['0370_03ff'][] = array('upper' => 976, 'status' => 'C', 'lower' => array(946)); /* GREEK BETA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 977, 'status' => 'C', 'lower' => array(952)); /* GREEK THETA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 981, 'status' => 'C', 'lower' => array(966)); /* GREEK PHI SYMBOL */ +$config['0370_03ff'][] = array('upper' => 982, 'status' => 'C', 'lower' => array(960)); /* GREEK PI SYMBOL */ +$config['0370_03ff'][] = array('upper' => 984, 'status' => 'C', 'lower' => array(985)); /* GREEK LETTER ARCHAIC KOPPA */ +$config['0370_03ff'][] = array('upper' => 986, 'status' => 'C', 'lower' => array(987)); /* GREEK LETTER STIGMA */ +$config['0370_03ff'][] = array('upper' => 988, 'status' => 'C', 'lower' => array(989)); /* GREEK LETTER DIGAMMA */ +$config['0370_03ff'][] = array('upper' => 990, 'status' => 'C', 'lower' => array(991)); /* GREEK LETTER KOPPA */ +$config['0370_03ff'][] = array('upper' => 992, 'status' => 'C', 'lower' => array(993)); /* GREEK LETTER SAMPI */ +$config['0370_03ff'][] = array('upper' => 994, 'status' => 'C', 'lower' => array(995)); /* COPTIC CAPITAL LETTER SHEI */ +$config['0370_03ff'][] = array('upper' => 996, 'status' => 'C', 'lower' => array(997)); /* COPTIC CAPITAL LETTER FEI */ +$config['0370_03ff'][] = array('upper' => 998, 'status' => 'C', 'lower' => array(999)); /* COPTIC CAPITAL LETTER KHEI */ +$config['0370_03ff'][] = array('upper' => 1000, 'status' => 'C', 'lower' => array(1001)); /* COPTIC CAPITAL LETTER HORI */ +$config['0370_03ff'][] = array('upper' => 1002, 'status' => 'C', 'lower' => array(1003)); /* COPTIC CAPITAL LETTER GANGIA */ +$config['0370_03ff'][] = array('upper' => 1004, 'status' => 'C', 'lower' => array(1005)); /* COPTIC CAPITAL LETTER SHIMA */ +$config['0370_03ff'][] = array('upper' => 1006, 'status' => 'C', 'lower' => array(1007)); /* COPTIC CAPITAL LETTER DEI */ +$config['0370_03ff'][] = array('upper' => 1008, 'status' => 'C', 'lower' => array(954)); /* GREEK KAPPA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1009, 'status' => 'C', 'lower' => array(961)); /* GREEK RHO SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1012, 'status' => 'C', 'lower' => array(952)); /* GREEK CAPITAL THETA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1013, 'status' => 'C', 'lower' => array(949)); /* GREEK LUNATE EPSILON SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1015, 'status' => 'C', 'lower' => array(1016)); /* GREEK CAPITAL LETTER SHO */ +$config['0370_03ff'][] = array('upper' => 1017, 'status' => 'C', 'lower' => array(1010)); /* GREEK CAPITAL LUNATE SIGMA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1018, 'status' => 'C', 'lower' => array(1019)); /* GREEK CAPITAL LETTER SAN */ +$config['0370_03ff'][] = array('upper' => 1021, 'status' => 'C', 'lower' => array(891)); /* GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1022, 'status' => 'C', 'lower' => array(892)); /* GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL */ +$config['0370_03ff'][] = array('upper' => 1023, 'status' => 'C', 'lower' => array(893)); /* GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0400_04ff.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0400_04ff.php new file mode 100644 index 000000000..9900171b2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0400_04ff.php @@ -0,0 +1,165 @@ + 1024, 'status' => 'C', 'lower' => array(1104)); /* CYRILLIC CAPITAL LETTER IE WITH GRAVE */ +$config['0400_04ff'][] = array('upper' => 1025, 'status' => 'C', 'lower' => array(1105)); /* CYRILLIC CAPITAL LETTER IO */ +$config['0400_04ff'][] = array('upper' => 1026, 'status' => 'C', 'lower' => array(1106)); /* CYRILLIC CAPITAL LETTER DJE */ +$config['0400_04ff'][] = array('upper' => 1027, 'status' => 'C', 'lower' => array(1107)); /* CYRILLIC CAPITAL LETTER GJE */ +$config['0400_04ff'][] = array('upper' => 1028, 'status' => 'C', 'lower' => array(1108)); /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */ +$config['0400_04ff'][] = array('upper' => 1029, 'status' => 'C', 'lower' => array(1109)); /* CYRILLIC CAPITAL LETTER DZE */ +$config['0400_04ff'][] = array('upper' => 1030, 'status' => 'C', 'lower' => array(1110)); /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ +$config['0400_04ff'][] = array('upper' => 1031, 'status' => 'C', 'lower' => array(1111)); /* CYRILLIC CAPITAL LETTER YI */ +$config['0400_04ff'][] = array('upper' => 1032, 'status' => 'C', 'lower' => array(1112)); /* CYRILLIC CAPITAL LETTER JE */ +$config['0400_04ff'][] = array('upper' => 1033, 'status' => 'C', 'lower' => array(1113)); /* CYRILLIC CAPITAL LETTER LJE */ +$config['0400_04ff'][] = array('upper' => 1034, 'status' => 'C', 'lower' => array(1114)); /* CYRILLIC CAPITAL LETTER NJE */ +$config['0400_04ff'][] = array('upper' => 1035, 'status' => 'C', 'lower' => array(1115)); /* CYRILLIC CAPITAL LETTER TSHE */ +$config['0400_04ff'][] = array('upper' => 1036, 'status' => 'C', 'lower' => array(1116)); /* CYRILLIC CAPITAL LETTER KJE */ +$config['0400_04ff'][] = array('upper' => 1037, 'status' => 'C', 'lower' => array(1117)); /* CYRILLIC CAPITAL LETTER I WITH GRAVE */ +$config['0400_04ff'][] = array('upper' => 1038, 'status' => 'C', 'lower' => array(1118)); /* CYRILLIC CAPITAL LETTER SHORT U */ +$config['0400_04ff'][] = array('upper' => 1039, 'status' => 'C', 'lower' => array(1119)); /* CYRILLIC CAPITAL LETTER DZHE */ +$config['0400_04ff'][] = array('upper' => 1040, 'status' => 'C', 'lower' => array(1072)); /* CYRILLIC CAPITAL LETTER A */ +$config['0400_04ff'][] = array('upper' => 1041, 'status' => 'C', 'lower' => array(1073)); /* CYRILLIC CAPITAL LETTER BE */ +$config['0400_04ff'][] = array('upper' => 1042, 'status' => 'C', 'lower' => array(1074)); /* CYRILLIC CAPITAL LETTER VE */ +$config['0400_04ff'][] = array('upper' => 1043, 'status' => 'C', 'lower' => array(1075)); /* CYRILLIC CAPITAL LETTER GHE */ +$config['0400_04ff'][] = array('upper' => 1044, 'status' => 'C', 'lower' => array(1076)); /* CYRILLIC CAPITAL LETTER DE */ +$config['0400_04ff'][] = array('upper' => 1045, 'status' => 'C', 'lower' => array(1077)); /* CYRILLIC CAPITAL LETTER IE */ +$config['0400_04ff'][] = array('upper' => 1046, 'status' => 'C', 'lower' => array(1078)); /* CYRILLIC CAPITAL LETTER ZHE */ +$config['0400_04ff'][] = array('upper' => 1047, 'status' => 'C', 'lower' => array(1079)); /* CYRILLIC CAPITAL LETTER ZE */ +$config['0400_04ff'][] = array('upper' => 1048, 'status' => 'C', 'lower' => array(1080)); /* CYRILLIC CAPITAL LETTER I */ +$config['0400_04ff'][] = array('upper' => 1049, 'status' => 'C', 'lower' => array(1081)); /* CYRILLIC CAPITAL LETTER SHORT I */ +$config['0400_04ff'][] = array('upper' => 1050, 'status' => 'C', 'lower' => array(1082)); /* CYRILLIC CAPITAL LETTER KA */ +$config['0400_04ff'][] = array('upper' => 1051, 'status' => 'C', 'lower' => array(1083)); /* CYRILLIC CAPITAL LETTER EL */ +$config['0400_04ff'][] = array('upper' => 1052, 'status' => 'C', 'lower' => array(1084)); /* CYRILLIC CAPITAL LETTER EM */ +$config['0400_04ff'][] = array('upper' => 1053, 'status' => 'C', 'lower' => array(1085)); /* CYRILLIC CAPITAL LETTER EN */ +$config['0400_04ff'][] = array('upper' => 1054, 'status' => 'C', 'lower' => array(1086)); /* CYRILLIC CAPITAL LETTER O */ +$config['0400_04ff'][] = array('upper' => 1055, 'status' => 'C', 'lower' => array(1087)); /* CYRILLIC CAPITAL LETTER PE */ +$config['0400_04ff'][] = array('upper' => 1056, 'status' => 'C', 'lower' => array(1088)); /* CYRILLIC CAPITAL LETTER ER */ +$config['0400_04ff'][] = array('upper' => 1057, 'status' => 'C', 'lower' => array(1089)); /* CYRILLIC CAPITAL LETTER ES */ +$config['0400_04ff'][] = array('upper' => 1058, 'status' => 'C', 'lower' => array(1090)); /* CYRILLIC CAPITAL LETTER TE */ +$config['0400_04ff'][] = array('upper' => 1059, 'status' => 'C', 'lower' => array(1091)); /* CYRILLIC CAPITAL LETTER U */ +$config['0400_04ff'][] = array('upper' => 1060, 'status' => 'C', 'lower' => array(1092)); /* CYRILLIC CAPITAL LETTER EF */ +$config['0400_04ff'][] = array('upper' => 1061, 'status' => 'C', 'lower' => array(1093)); /* CYRILLIC CAPITAL LETTER HA */ +$config['0400_04ff'][] = array('upper' => 1062, 'status' => 'C', 'lower' => array(1094)); /* CYRILLIC CAPITAL LETTER TSE */ +$config['0400_04ff'][] = array('upper' => 1063, 'status' => 'C', 'lower' => array(1095)); /* CYRILLIC CAPITAL LETTER CHE */ +$config['0400_04ff'][] = array('upper' => 1064, 'status' => 'C', 'lower' => array(1096)); /* CYRILLIC CAPITAL LETTER SHA */ +$config['0400_04ff'][] = array('upper' => 1065, 'status' => 'C', 'lower' => array(1097)); /* CYRILLIC CAPITAL LETTER SHCHA */ +$config['0400_04ff'][] = array('upper' => 1066, 'status' => 'C', 'lower' => array(1098)); /* CYRILLIC CAPITAL LETTER HARD SIGN */ +$config['0400_04ff'][] = array('upper' => 1067, 'status' => 'C', 'lower' => array(1099)); /* CYRILLIC CAPITAL LETTER YERU */ +$config['0400_04ff'][] = array('upper' => 1068, 'status' => 'C', 'lower' => array(1100)); /* CYRILLIC CAPITAL LETTER SOFT SIGN */ +$config['0400_04ff'][] = array('upper' => 1069, 'status' => 'C', 'lower' => array(1101)); /* CYRILLIC CAPITAL LETTER E */ +$config['0400_04ff'][] = array('upper' => 1070, 'status' => 'C', 'lower' => array(1102)); /* CYRILLIC CAPITAL LETTER YU */ +$config['0400_04ff'][] = array('upper' => 1071, 'status' => 'C', 'lower' => array(1103)); /* CYRILLIC CAPITAL LETTER YA */ +$config['0400_04ff'][] = array('upper' => 1120, 'status' => 'C', 'lower' => array(1121)); /* CYRILLIC CAPITAL LETTER OMEGA */ +$config['0400_04ff'][] = array('upper' => 1122, 'status' => 'C', 'lower' => array(1123)); /* CYRILLIC CAPITAL LETTER YAT */ +$config['0400_04ff'][] = array('upper' => 1124, 'status' => 'C', 'lower' => array(1125)); /* CYRILLIC CAPITAL LETTER IOTIFIED E */ +$config['0400_04ff'][] = array('upper' => 1126, 'status' => 'C', 'lower' => array(1127)); /* CYRILLIC CAPITAL LETTER LITTLE YUS */ +$config['0400_04ff'][] = array('upper' => 1128, 'status' => 'C', 'lower' => array(1129)); /* CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS */ +$config['0400_04ff'][] = array('upper' => 1130, 'status' => 'C', 'lower' => array(1131)); /* CYRILLIC CAPITAL LETTER BIG YUS */ +$config['0400_04ff'][] = array('upper' => 1132, 'status' => 'C', 'lower' => array(1133)); /* CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS */ +$config['0400_04ff'][] = array('upper' => 1134, 'status' => 'C', 'lower' => array(1135)); /* CYRILLIC CAPITAL LETTER KSI */ +$config['0400_04ff'][] = array('upper' => 1136, 'status' => 'C', 'lower' => array(1137)); /* CYRILLIC CAPITAL LETTER PSI */ +$config['0400_04ff'][] = array('upper' => 1138, 'status' => 'C', 'lower' => array(1139)); /* CYRILLIC CAPITAL LETTER FITA */ +$config['0400_04ff'][] = array('upper' => 1140, 'status' => 'C', 'lower' => array(1141)); /* CYRILLIC CAPITAL LETTER IZHITSA */ +$config['0400_04ff'][] = array('upper' => 1142, 'status' => 'C', 'lower' => array(1143)); /* CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT */ +$config['0400_04ff'][] = array('upper' => 1144, 'status' => 'C', 'lower' => array(1145)); /* CYRILLIC CAPITAL LETTER UK */ +$config['0400_04ff'][] = array('upper' => 1146, 'status' => 'C', 'lower' => array(1147)); /* CYRILLIC CAPITAL LETTER ROUND OMEGA */ +$config['0400_04ff'][] = array('upper' => 1148, 'status' => 'C', 'lower' => array(1149)); /* CYRILLIC CAPITAL LETTER OMEGA WITH TITLO */ +$config['0400_04ff'][] = array('upper' => 1150, 'status' => 'C', 'lower' => array(1151)); /* CYRILLIC CAPITAL LETTER OT */ +$config['0400_04ff'][] = array('upper' => 1152, 'status' => 'C', 'lower' => array(1153)); /* CYRILLIC CAPITAL LETTER KOPPA */ +$config['0400_04ff'][] = array('upper' => 1162, 'status' => 'C', 'lower' => array(1163)); /* CYRILLIC CAPITAL LETTER SHORT I WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1164, 'status' => 'C', 'lower' => array(1165)); /* CYRILLIC CAPITAL LETTER SEMISOFT SIGN */ +$config['0400_04ff'][] = array('upper' => 1166, 'status' => 'C', 'lower' => array(1167)); /* CYRILLIC CAPITAL LETTER ER WITH TICK */ +$config['0400_04ff'][] = array('upper' => 1168, 'status' => 'C', 'lower' => array(1169)); /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ +$config['0400_04ff'][] = array('upper' => 1170, 'status' => 'C', 'lower' => array(1171)); /* CYRILLIC CAPITAL LETTER GHE WITH STROKE */ +$config['0400_04ff'][] = array('upper' => 1172, 'status' => 'C', 'lower' => array(1173)); /* CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK */ +$config['0400_04ff'][] = array('upper' => 1174, 'status' => 'C', 'lower' => array(1175)); /* CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1176, 'status' => 'C', 'lower' => array(1177)); /* CYRILLIC CAPITAL LETTER ZE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1178, 'status' => 'C', 'lower' => array(1179)); /* CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1180, 'status' => 'C', 'lower' => array(1181)); /* CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ +$config['0400_04ff'][] = array('upper' => 1182, 'status' => 'C', 'lower' => array(1183)); /* CYRILLIC CAPITAL LETTER KA WITH STROKE */ +$config['0400_04ff'][] = array('upper' => 1184, 'status' => 'C', 'lower' => array(1185)); /* CYRILLIC CAPITAL LETTER BASHKIR KA */ +$config['0400_04ff'][] = array('upper' => 1186, 'status' => 'C', 'lower' => array(1187)); /* CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1188, 'status' => 'C', 'lower' => array(1189)); /* CYRILLIC CAPITAL LIGATURE EN GHE */ +$config['0400_04ff'][] = array('upper' => 1190, 'status' => 'C', 'lower' => array(1191)); /* CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK */ +$config['0400_04ff'][] = array('upper' => 1192, 'status' => 'C', 'lower' => array(1193)); /* CYRILLIC CAPITAL LETTER ABKHASIAN HA */ +$config['0400_04ff'][] = array('upper' => 1194, 'status' => 'C', 'lower' => array(1195)); /* CYRILLIC CAPITAL LETTER ES WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1196, 'status' => 'C', 'lower' => array(1197)); /* CYRILLIC CAPITAL LETTER TE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1198, 'status' => 'C', 'lower' => array(1199)); /* CYRILLIC CAPITAL LETTER STRAIGHT U */ +$config['0400_04ff'][] = array('upper' => 1200, 'status' => 'C', 'lower' => array(1201)); /* CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ +$config['0400_04ff'][] = array('upper' => 1202, 'status' => 'C', 'lower' => array(1203)); /* CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1204, 'status' => 'C', 'lower' => array(1205)); /* CYRILLIC CAPITAL LIGATURE TE TSE */ +$config['0400_04ff'][] = array('upper' => 1206, 'status' => 'C', 'lower' => array(1207)); /* CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1208, 'status' => 'C', 'lower' => array(1209)); /* CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ +$config['0400_04ff'][] = array('upper' => 1210, 'status' => 'C', 'lower' => array(1211)); /* CYRILLIC CAPITAL LETTER SHHA */ +$config['0400_04ff'][] = array('upper' => 1212, 'status' => 'C', 'lower' => array(1213)); /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE */ +$config['0400_04ff'][] = array('upper' => 1214, 'status' => 'C', 'lower' => array(1215)); /* CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1216, 'status' => 'C', 'lower' => array(1231)); /* CYRILLIC LETTER PALOCHKA */ +$config['0400_04ff'][] = array('upper' => 1217, 'status' => 'C', 'lower' => array(1218)); /* CYRILLIC CAPITAL LETTER ZHE WITH BREVE */ +$config['0400_04ff'][] = array('upper' => 1219, 'status' => 'C', 'lower' => array(1220)); /* CYRILLIC CAPITAL LETTER KA WITH HOOK */ +$config['0400_04ff'][] = array('upper' => 1221, 'status' => 'C', 'lower' => array(1222)); /* CYRILLIC CAPITAL LETTER EL WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1223, 'status' => 'C', 'lower' => array(1224)); /* CYRILLIC CAPITAL LETTER EN WITH HOOK */ +$config['0400_04ff'][] = array('upper' => 1225, 'status' => 'C', 'lower' => array(1226)); /* CYRILLIC CAPITAL LETTER EN WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1227, 'status' => 'C', 'lower' => array(1228)); /* CYRILLIC CAPITAL LETTER KHAKASSIAN CHE */ +$config['0400_04ff'][] = array('upper' => 1229, 'status' => 'C', 'lower' => array(1230)); /* CYRILLIC CAPITAL LETTER EM WITH TAIL */ +$config['0400_04ff'][] = array('upper' => 1232, 'status' => 'C', 'lower' => array(1233)); /* CYRILLIC CAPITAL LETTER A WITH BREVE */ +$config['0400_04ff'][] = array('upper' => 1234, 'status' => 'C', 'lower' => array(1235)); /* CYRILLIC CAPITAL LETTER A WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1236, 'status' => 'C', 'lower' => array(1237)); /* CYRILLIC CAPITAL LIGATURE A IE */ +$config['0400_04ff'][] = array('upper' => 1238, 'status' => 'C', 'lower' => array(1239)); /* CYRILLIC CAPITAL LETTER IE WITH BREVE */ +$config['0400_04ff'][] = array('upper' => 1240, 'status' => 'C', 'lower' => array(1241)); /* CYRILLIC CAPITAL LETTER SCHWA */ +$config['0400_04ff'][] = array('upper' => 1242, 'status' => 'C', 'lower' => array(1243)); /* CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1244, 'status' => 'C', 'lower' => array(1245)); /* CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1246, 'status' => 'C', 'lower' => array(1247)); /* CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1248, 'status' => 'C', 'lower' => array(1249)); /* CYRILLIC CAPITAL LETTER ABKHASIAN DZE */ +$config['0400_04ff'][] = array('upper' => 1250, 'status' => 'C', 'lower' => array(1251)); /* CYRILLIC CAPITAL LETTER I WITH MACRON */ +$config['0400_04ff'][] = array('upper' => 1252, 'status' => 'C', 'lower' => array(1253)); /* CYRILLIC CAPITAL LETTER I WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1254, 'status' => 'C', 'lower' => array(1255)); /* CYRILLIC CAPITAL LETTER O WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1256, 'status' => 'C', 'lower' => array(1257)); /* CYRILLIC CAPITAL LETTER BARRED O */ +$config['0400_04ff'][] = array('upper' => 1258, 'status' => 'C', 'lower' => array(1259)); /* CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1260, 'status' => 'C', 'lower' => array(1261)); /* CYRILLIC CAPITAL LETTER E WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1262, 'status' => 'C', 'lower' => array(1263)); /* CYRILLIC CAPITAL LETTER U WITH MACRON */ +$config['0400_04ff'][] = array('upper' => 1264, 'status' => 'C', 'lower' => array(1265)); /* CYRILLIC CAPITAL LETTER U WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1266, 'status' => 'C', 'lower' => array(1267)); /* CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE */ +$config['0400_04ff'][] = array('upper' => 1268, 'status' => 'C', 'lower' => array(1269)); /* CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1270, 'status' => 'C', 'lower' => array(1271)); /* CYRILLIC CAPITAL LETTER GHE WITH DESCENDER */ +$config['0400_04ff'][] = array('upper' => 1272, 'status' => 'C', 'lower' => array(1273)); /* CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS */ +$config['0400_04ff'][] = array('upper' => 1274, 'status' => 'C', 'lower' => array(1275)); /* CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK */ +$config['0400_04ff'][] = array('upper' => 1276, 'status' => 'C', 'lower' => array(1277)); /* CYRILLIC CAPITAL LETTER HA WITH HOOK */ +$config['0400_04ff'][] = array('upper' => 1278, 'status' => 'C', 'lower' => array(1279)); /* CYRILLIC CAPITAL LETTER HA WITH STROKE */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0500_052f.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0500_052f.php new file mode 100644 index 000000000..7e3c956d1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0500_052f.php @@ -0,0 +1,49 @@ + 1280, 'status' => 'C', 'lower' => array(1281)); /* CYRILLIC CAPITAL LETTER KOMI DE */ +$config['0500_052f'][] = array('upper' => 1282, 'status' => 'C', 'lower' => array(1283)); /* CYRILLIC CAPITAL LETTER KOMI DJE */ +$config['0500_052f'][] = array('upper' => 1284, 'status' => 'C', 'lower' => array(1285)); /* CYRILLIC CAPITAL LETTER KOMI ZJE */ +$config['0500_052f'][] = array('upper' => 1286, 'status' => 'C', 'lower' => array(1287)); /* CYRILLIC CAPITAL LETTER KOMI DZJE */ +$config['0500_052f'][] = array('upper' => 1288, 'status' => 'C', 'lower' => array(1289)); /* CYRILLIC CAPITAL LETTER KOMI LJE */ +$config['0500_052f'][] = array('upper' => 1290, 'status' => 'C', 'lower' => array(1291)); /* CYRILLIC CAPITAL LETTER KOMI NJE */ +$config['0500_052f'][] = array('upper' => 1292, 'status' => 'C', 'lower' => array(1293)); /* CYRILLIC CAPITAL LETTER KOMI SJE */ +$config['0500_052f'][] = array('upper' => 1294, 'status' => 'C', 'lower' => array(1295)); /* CYRILLIC CAPITAL LETTER KOMI TJE */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0530_058f.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0530_058f.php new file mode 100644 index 000000000..9bfd6dc8d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/0530_058f.php @@ -0,0 +1,79 @@ + 1329, 'status' => 'C', 'lower' => array(1377)); /* ARMENIAN CAPITAL LETTER AYB */ +$config['0530_058f'][] = array('upper' => 1330, 'status' => 'C', 'lower' => array(1378)); /* ARMENIAN CAPITAL LETTER BEN */ +$config['0530_058f'][] = array('upper' => 1331, 'status' => 'C', 'lower' => array(1379)); /* ARMENIAN CAPITAL LETTER GIM */ +$config['0530_058f'][] = array('upper' => 1332, 'status' => 'C', 'lower' => array(1380)); /* ARMENIAN CAPITAL LETTER DA */ +$config['0530_058f'][] = array('upper' => 1333, 'status' => 'C', 'lower' => array(1381)); /* ARMENIAN CAPITAL LETTER ECH */ +$config['0530_058f'][] = array('upper' => 1334, 'status' => 'C', 'lower' => array(1382)); /* ARMENIAN CAPITAL LETTER ZA */ +$config['0530_058f'][] = array('upper' => 1335, 'status' => 'C', 'lower' => array(1383)); /* ARMENIAN CAPITAL LETTER EH */ +$config['0530_058f'][] = array('upper' => 1336, 'status' => 'C', 'lower' => array(1384)); /* ARMENIAN CAPITAL LETTER ET */ +$config['0530_058f'][] = array('upper' => 1337, 'status' => 'C', 'lower' => array(1385)); /* ARMENIAN CAPITAL LETTER TO */ +$config['0530_058f'][] = array('upper' => 1338, 'status' => 'C', 'lower' => array(1386)); /* ARMENIAN CAPITAL LETTER ZHE */ +$config['0530_058f'][] = array('upper' => 1339, 'status' => 'C', 'lower' => array(1387)); /* ARMENIAN CAPITAL LETTER INI */ +$config['0530_058f'][] = array('upper' => 1340, 'status' => 'C', 'lower' => array(1388)); /* ARMENIAN CAPITAL LETTER LIWN */ +$config['0530_058f'][] = array('upper' => 1341, 'status' => 'C', 'lower' => array(1389)); /* ARMENIAN CAPITAL LETTER XEH */ +$config['0530_058f'][] = array('upper' => 1342, 'status' => 'C', 'lower' => array(1390)); /* ARMENIAN CAPITAL LETTER CA */ +$config['0530_058f'][] = array('upper' => 1343, 'status' => 'C', 'lower' => array(1391)); /* ARMENIAN CAPITAL LETTER KEN */ +$config['0530_058f'][] = array('upper' => 1344, 'status' => 'C', 'lower' => array(1392)); /* ARMENIAN CAPITAL LETTER HO */ +$config['0530_058f'][] = array('upper' => 1345, 'status' => 'C', 'lower' => array(1393)); /* ARMENIAN CAPITAL LETTER JA */ +$config['0530_058f'][] = array('upper' => 1346, 'status' => 'C', 'lower' => array(1394)); /* ARMENIAN CAPITAL LETTER GHAD */ +$config['0530_058f'][] = array('upper' => 1347, 'status' => 'C', 'lower' => array(1395)); /* ARMENIAN CAPITAL LETTER CHEH */ +$config['0530_058f'][] = array('upper' => 1348, 'status' => 'C', 'lower' => array(1396)); /* ARMENIAN CAPITAL LETTER MEN */ +$config['0530_058f'][] = array('upper' => 1349, 'status' => 'C', 'lower' => array(1397)); /* ARMENIAN CAPITAL LETTER YI */ +$config['0530_058f'][] = array('upper' => 1350, 'status' => 'C', 'lower' => array(1398)); /* ARMENIAN CAPITAL LETTER NOW */ +$config['0530_058f'][] = array('upper' => 1351, 'status' => 'C', 'lower' => array(1399)); /* ARMENIAN CAPITAL LETTER SHA */ +$config['0530_058f'][] = array('upper' => 1352, 'status' => 'C', 'lower' => array(1400)); /* ARMENIAN CAPITAL LETTER VO */ +$config['0530_058f'][] = array('upper' => 1353, 'status' => 'C', 'lower' => array(1401)); /* ARMENIAN CAPITAL LETTER CHA */ +$config['0530_058f'][] = array('upper' => 1354, 'status' => 'C', 'lower' => array(1402)); /* ARMENIAN CAPITAL LETTER PEH */ +$config['0530_058f'][] = array('upper' => 1355, 'status' => 'C', 'lower' => array(1403)); /* ARMENIAN CAPITAL LETTER JHEH */ +$config['0530_058f'][] = array('upper' => 1356, 'status' => 'C', 'lower' => array(1404)); /* ARMENIAN CAPITAL LETTER RA */ +$config['0530_058f'][] = array('upper' => 1357, 'status' => 'C', 'lower' => array(1405)); /* ARMENIAN CAPITAL LETTER SEH */ +$config['0530_058f'][] = array('upper' => 1358, 'status' => 'C', 'lower' => array(1406)); /* ARMENIAN CAPITAL LETTER VEW */ +$config['0530_058f'][] = array('upper' => 1359, 'status' => 'C', 'lower' => array(1407)); /* ARMENIAN CAPITAL LETTER TIWN */ +$config['0530_058f'][] = array('upper' => 1360, 'status' => 'C', 'lower' => array(1408)); /* ARMENIAN CAPITAL LETTER REH */ +$config['0530_058f'][] = array('upper' => 1361, 'status' => 'C', 'lower' => array(1409)); /* ARMENIAN CAPITAL LETTER CO */ +$config['0530_058f'][] = array('upper' => 1362, 'status' => 'C', 'lower' => array(1410)); /* ARMENIAN CAPITAL LETTER YIWN */ +$config['0530_058f'][] = array('upper' => 1363, 'status' => 'C', 'lower' => array(1411)); /* ARMENIAN CAPITAL LETTER PIWR */ +$config['0530_058f'][] = array('upper' => 1364, 'status' => 'C', 'lower' => array(1412)); /* ARMENIAN CAPITAL LETTER KEH */ +$config['0530_058f'][] = array('upper' => 1365, 'status' => 'C', 'lower' => array(1413)); /* ARMENIAN CAPITAL LETTER OH */ +$config['0530_058f'][] = array('upper' => 1366, 'status' => 'C', 'lower' => array(1414)); /* ARMENIAN CAPITAL LETTER FEH */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/1e00_1eff.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/1e00_1eff.php new file mode 100644 index 000000000..d4214dda1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/1e00_1eff.php @@ -0,0 +1,169 @@ + 7680, 'status' => 'C', 'lower' => array(7681)); /* LATIN CAPITAL LETTER A WITH RING BELOW */ +$config['1e00_1eff'][] = array('upper' => 7682, 'status' => 'C', 'lower' => array(7683)); /* LATIN CAPITAL LETTER B WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7684, 'status' => 'C', 'lower' => array(7685)); /* LATIN CAPITAL LETTER B WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7686, 'status' => 'C', 'lower' => array(7687)); /* LATIN CAPITAL LETTER B WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7688, 'status' => 'C', 'lower' => array(7689)); /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7690, 'status' => 'C', 'lower' => array(7691)); /* LATIN CAPITAL LETTER D WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7692, 'status' => 'C', 'lower' => array(7693)); /* LATIN CAPITAL LETTER D WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7694, 'status' => 'C', 'lower' => array(7695)); /* LATIN CAPITAL LETTER D WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7696, 'status' => 'C', 'lower' => array(7697)); /* LATIN CAPITAL LETTER D WITH CEDILLA */ +$config['1e00_1eff'][] = array('upper' => 7698, 'status' => 'C', 'lower' => array(7699)); /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7700, 'status' => 'C', 'lower' => array(7701)); /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7702, 'status' => 'C', 'lower' => array(7703)); /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7704, 'status' => 'C', 'lower' => array(7705)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7706, 'status' => 'C', 'lower' => array(7707)); /* LATIN CAPITAL LETTER E WITH TILDE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7708, 'status' => 'C', 'lower' => array(7709)); /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */ +$config['1e00_1eff'][] = array('upper' => 7710, 'status' => 'C', 'lower' => array(7711)); /* LATIN CAPITAL LETTER F WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7712, 'status' => 'C', 'lower' => array(7713)); /* LATIN CAPITAL LETTER G WITH MACRON */ +$config['1e00_1eff'][] = array('upper' => 7714, 'status' => 'C', 'lower' => array(7715)); /* LATIN CAPITAL LETTER H WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7716, 'status' => 'C', 'lower' => array(7717)); /* LATIN CAPITAL LETTER H WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7718, 'status' => 'C', 'lower' => array(7719)); /* LATIN CAPITAL LETTER H WITH DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7720, 'status' => 'C', 'lower' => array(7721)); /* LATIN CAPITAL LETTER H WITH CEDILLA */ +$config['1e00_1eff'][] = array('upper' => 7722, 'status' => 'C', 'lower' => array(7723)); /* LATIN CAPITAL LETTER H WITH BREVE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7724, 'status' => 'C', 'lower' => array(7725)); /* LATIN CAPITAL LETTER I WITH TILDE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7726, 'status' => 'C', 'lower' => array(7727)); /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7728, 'status' => 'C', 'lower' => array(7729)); /* LATIN CAPITAL LETTER K WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7730, 'status' => 'C', 'lower' => array(7731)); /* LATIN CAPITAL LETTER K WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7732, 'status' => 'C', 'lower' => array(7733)); /* LATIN CAPITAL LETTER K WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7734, 'status' => 'C', 'lower' => array(7735)); /* LATIN CAPITAL LETTER L WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7736, 'status' => 'C', 'lower' => array(7737)); /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */ +$config['1e00_1eff'][] = array('upper' => 7738, 'status' => 'C', 'lower' => array(7739)); /* LATIN CAPITAL LETTER L WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7740, 'status' => 'C', 'lower' => array(7741)); /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7742, 'status' => 'C', 'lower' => array(7743)); /* LATIN CAPITAL LETTER M WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7744, 'status' => 'C', 'lower' => array(7745)); /* LATIN CAPITAL LETTER M WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7746, 'status' => 'C', 'lower' => array(7747)); /* LATIN CAPITAL LETTER M WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7748, 'status' => 'C', 'lower' => array(7749)); /* LATIN CAPITAL LETTER N WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7750, 'status' => 'C', 'lower' => array(7751)); /* LATIN CAPITAL LETTER N WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7752, 'status' => 'C', 'lower' => array(7753)); /* LATIN CAPITAL LETTER N WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7754, 'status' => 'C', 'lower' => array(7755)); /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7756, 'status' => 'C', 'lower' => array(7757)); /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7758, 'status' => 'C', 'lower' => array(7759)); /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7760, 'status' => 'C', 'lower' => array(7761)); /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7762, 'status' => 'C', 'lower' => array(7763)); /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7764, 'status' => 'C', 'lower' => array(7765)); /* LATIN CAPITAL LETTER P WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7766, 'status' => 'C', 'lower' => array(7767)); /* LATIN CAPITAL LETTER P WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7768, 'status' => 'C', 'lower' => array(7769)); /* LATIN CAPITAL LETTER R WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7770, 'status' => 'C', 'lower' => array(7771)); /* LATIN CAPITAL LETTER R WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7772, 'status' => 'C', 'lower' => array(7773)); /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */ +$config['1e00_1eff'][] = array('upper' => 7774, 'status' => 'C', 'lower' => array(7775)); /* LATIN CAPITAL LETTER R WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7776, 'status' => 'C', 'lower' => array(7777)); /* LATIN CAPITAL LETTER S WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7778, 'status' => 'C', 'lower' => array(7779)); /* LATIN CAPITAL LETTER S WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7780, 'status' => 'C', 'lower' => array(7781)); /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7782, 'status' => 'C', 'lower' => array(7783)); /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7784, 'status' => 'C', 'lower' => array(7785)); /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7786, 'status' => 'C', 'lower' => array(7787)); /* LATIN CAPITAL LETTER T WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7788, 'status' => 'C', 'lower' => array(7789)); /* LATIN CAPITAL LETTER T WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7790, 'status' => 'C', 'lower' => array(7791)); /* LATIN CAPITAL LETTER T WITH LINE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7792, 'status' => 'C', 'lower' => array(7793)); /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7794, 'status' => 'C', 'lower' => array(7795)); /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */ +$config['1e00_1eff'][] = array('upper' => 7796, 'status' => 'C', 'lower' => array(7797)); /* LATIN CAPITAL LETTER U WITH TILDE BELOW */ +$config['1e00_1eff'][] = array('upper' => 7798, 'status' => 'C', 'lower' => array(7799)); /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */ +$config['1e00_1eff'][] = array('upper' => 7800, 'status' => 'C', 'lower' => array(7801)); /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7802, 'status' => 'C', 'lower' => array(7803)); /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7804, 'status' => 'C', 'lower' => array(7805)); /* LATIN CAPITAL LETTER V WITH TILDE */ +$config['1e00_1eff'][] = array('upper' => 7806, 'status' => 'C', 'lower' => array(7807)); /* LATIN CAPITAL LETTER V WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7808, 'status' => 'C', 'lower' => array(7809)); /* LATIN CAPITAL LETTER W WITH GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7810, 'status' => 'C', 'lower' => array(7811)); /* LATIN CAPITAL LETTER W WITH ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7812, 'status' => 'C', 'lower' => array(7813)); /* LATIN CAPITAL LETTER W WITH DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7814, 'status' => 'C', 'lower' => array(7815)); /* LATIN CAPITAL LETTER W WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7816, 'status' => 'C', 'lower' => array(7817)); /* LATIN CAPITAL LETTER W WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7818, 'status' => 'C', 'lower' => array(7819)); /* LATIN CAPITAL LETTER X WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7820, 'status' => 'C', 'lower' => array(7821)); /* LATIN CAPITAL LETTER X WITH DIAERESIS */ +$config['1e00_1eff'][] = array('upper' => 7822, 'status' => 'C', 'lower' => array(7823)); /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7824, 'status' => 'C', 'lower' => array(7825)); /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */ +$config['1e00_1eff'][] = array('upper' => 7826, 'status' => 'C', 'lower' => array(7827)); /* LATIN CAPITAL LETTER Z WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7828, 'status' => 'C', 'lower' => array(7829)); /* LATIN CAPITAL LETTER Z WITH LINE BELOW */ + +//$config['1e00_1eff'][] = array('upper' => 7830, 'status' => 'F', 'lower' => array(104, 817)); /* LATIN SMALL LETTER H WITH LINE BELOW */ +//$config['1e00_1eff'][] = array('upper' => 7831, 'status' => 'F', 'lower' => array(116, 776)); /* LATIN SMALL LETTER T WITH DIAERESIS */ +//$config['1e00_1eff'][] = array('upper' => 7832, 'status' => 'F', 'lower' => array(119, 778)); /* LATIN SMALL LETTER W WITH RING ABOVE */ +//$config['1e00_1eff'][] = array('upper' => 7833, 'status' => 'F', 'lower' => array(121, 778)); /* LATIN SMALL LETTER Y WITH RING ABOVE */ +//$config['1e00_1eff'][] = array('upper' => 7834, 'status' => 'F', 'lower' => array(97, 702)); /* LATIN SMALL LETTER A WITH RIGHT HALF RING */ +//$config['1e00_1eff'][] = array('upper' => 7835, 'status' => 'C', 'lower' => array(7777)); /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */ + +$config['1e00_1eff'][] = array('upper' => 7840, 'status' => 'C', 'lower' => array(7841)); /* LATIN CAPITAL LETTER A WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7842, 'status' => 'C', 'lower' => array(7843)); /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7844, 'status' => 'C', 'lower' => array(7845)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7846, 'status' => 'C', 'lower' => array(7847)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7848, 'status' => 'C', 'lower' => array(7849)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7850, 'status' => 'C', 'lower' => array(7851)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7852, 'status' => 'C', 'lower' => array(7853)); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7854, 'status' => 'C', 'lower' => array(7855)); /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7856, 'status' => 'C', 'lower' => array(7857)); /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7858, 'status' => 'C', 'lower' => array(7859)); /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7860, 'status' => 'C', 'lower' => array(7861)); /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7862, 'status' => 'C', 'lower' => array(7863)); /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7864, 'status' => 'C', 'lower' => array(7865)); /* LATIN CAPITAL LETTER E WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7866, 'status' => 'C', 'lower' => array(7867)); /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7868, 'status' => 'C', 'lower' => array(7869)); /* LATIN CAPITAL LETTER E WITH TILDE */ +$config['1e00_1eff'][] = array('upper' => 7870, 'status' => 'C', 'lower' => array(7871)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7872, 'status' => 'C', 'lower' => array(7873)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7874, 'status' => 'C', 'lower' => array(7875)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7876, 'status' => 'C', 'lower' => array(7877)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7878, 'status' => 'C', 'lower' => array(7879)); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7880, 'status' => 'C', 'lower' => array(7881)); /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7882, 'status' => 'C', 'lower' => array(7883)); /* LATIN CAPITAL LETTER I WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7884, 'status' => 'C', 'lower' => array(7885)); /* LATIN CAPITAL LETTER O WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7886, 'status' => 'C', 'lower' => array(7887)); /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7888, 'status' => 'C', 'lower' => array(7889)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7890, 'status' => 'C', 'lower' => array(7891)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7892, 'status' => 'C', 'lower' => array(7893)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7894, 'status' => 'C', 'lower' => array(7895)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7896, 'status' => 'C', 'lower' => array(7897)); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7898, 'status' => 'C', 'lower' => array(7899)); /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7900, 'status' => 'C', 'lower' => array(7901)); /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7902, 'status' => 'C', 'lower' => array(7903)); /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7904, 'status' => 'C', 'lower' => array(7905)); /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7906, 'status' => 'C', 'lower' => array(7907)); /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7908, 'status' => 'C', 'lower' => array(7909)); /* LATIN CAPITAL LETTER U WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7910, 'status' => 'C', 'lower' => array(7911)); /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7912, 'status' => 'C', 'lower' => array(7913)); /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ +$config['1e00_1eff'][] = array('upper' => 7914, 'status' => 'C', 'lower' => array(7915)); /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7916, 'status' => 'C', 'lower' => array(7917)); /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7918, 'status' => 'C', 'lower' => array(7919)); /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */ +$config['1e00_1eff'][] = array('upper' => 7920, 'status' => 'C', 'lower' => array(7921)); /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7922, 'status' => 'C', 'lower' => array(7923)); /* LATIN CAPITAL LETTER Y WITH GRAVE */ +$config['1e00_1eff'][] = array('upper' => 7924, 'status' => 'C', 'lower' => array(7925)); /* LATIN CAPITAL LETTER Y WITH DOT BELOW */ +$config['1e00_1eff'][] = array('upper' => 7926, 'status' => 'C', 'lower' => array(7927)); /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ +$config['1e00_1eff'][] = array('upper' => 7928, 'status' => 'C', 'lower' => array(7929)); /* LATIN CAPITAL LETTER Y WITH TILDE */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/1f00_1fff.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/1f00_1fff.php new file mode 100644 index 000000000..b8b25cf0e --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/1f00_1fff.php @@ -0,0 +1,217 @@ + 7944, 'status' => 'C', 'lower' => array(7936, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7945, 'status' => 'C', 'lower' => array(7937)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7946, 'status' => 'C', 'lower' => array(7938)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7947, 'status' => 'C', 'lower' => array(7939)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7948, 'status' => 'C', 'lower' => array(7940)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7949, 'status' => 'C', 'lower' => array(7941)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7950, 'status' => 'C', 'lower' => array(7942)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7951, 'status' => 'C', 'lower' => array(7943)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7960, 'status' => 'C', 'lower' => array(7952)); /* GREEK CAPITAL LETTER EPSILON WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7961, 'status' => 'C', 'lower' => array(7953)); /* GREEK CAPITAL LETTER EPSILON WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7962, 'status' => 'C', 'lower' => array(7954)); /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7963, 'status' => 'C', 'lower' => array(7955)); /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7964, 'status' => 'C', 'lower' => array(7956)); /* GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7965, 'status' => 'C', 'lower' => array(7957)); /* GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7976, 'status' => 'C', 'lower' => array(7968)); /* GREEK CAPITAL LETTER ETA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7977, 'status' => 'C', 'lower' => array(7969)); /* GREEK CAPITAL LETTER ETA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7978, 'status' => 'C', 'lower' => array(7970)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7979, 'status' => 'C', 'lower' => array(7971)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7980, 'status' => 'C', 'lower' => array(7972)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7981, 'status' => 'C', 'lower' => array(7973)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7982, 'status' => 'C', 'lower' => array(7974)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7983, 'status' => 'C', 'lower' => array(7975)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7992, 'status' => 'C', 'lower' => array(7984)); /* GREEK CAPITAL LETTER IOTA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 7993, 'status' => 'C', 'lower' => array(7985)); /* GREEK CAPITAL LETTER IOTA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 7994, 'status' => 'C', 'lower' => array(7986)); /* GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7995, 'status' => 'C', 'lower' => array(7987)); /* GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 7996, 'status' => 'C', 'lower' => array(7988)); /* GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7997, 'status' => 'C', 'lower' => array(7989)); /* GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 7998, 'status' => 'C', 'lower' => array(7990)); /* GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 7999, 'status' => 'C', 'lower' => array(7991)); /* GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8008, 'status' => 'C', 'lower' => array(8000)); /* GREEK CAPITAL LETTER OMICRON WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8009, 'status' => 'C', 'lower' => array(8001)); /* GREEK CAPITAL LETTER OMICRON WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8010, 'status' => 'C', 'lower' => array(8002)); /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8011, 'status' => 'C', 'lower' => array(8003)); /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8012, 'status' => 'C', 'lower' => array(8004)); /* GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8013, 'status' => 'C', 'lower' => array(8005)); /* GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8016, 'status' => 'F', 'lower' => array(965, 787)); /* GREEK SMALL LETTER UPSILON WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8018, 'status' => 'F', 'lower' => array(965, 787, 768)); /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8020, 'status' => 'F', 'lower' => array(965, 787, 769)); /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8022, 'status' => 'F', 'lower' => array(965, 787, 834)); /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8025, 'status' => 'C', 'lower' => array(8017)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8027, 'status' => 'C', 'lower' => array(8019)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8029, 'status' => 'C', 'lower' => array(8021)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8031, 'status' => 'C', 'lower' => array(8023)); /* GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8040, 'status' => 'C', 'lower' => array(8032)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8041, 'status' => 'C', 'lower' => array(8033)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8042, 'status' => 'C', 'lower' => array(8034)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8043, 'status' => 'C', 'lower' => array(8035)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8044, 'status' => 'C', 'lower' => array(8036)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8045, 'status' => 'C', 'lower' => array(8037)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8046, 'status' => 'C', 'lower' => array(8038)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8047, 'status' => 'C', 'lower' => array(8039)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8064, 'status' => 'F', 'lower' => array(7936, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8065, 'status' => 'F', 'lower' => array(7937, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8066, 'status' => 'F', 'lower' => array(7938, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8067, 'status' => 'F', 'lower' => array(7939, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8068, 'status' => 'F', 'lower' => array(7940, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8069, 'status' => 'F', 'lower' => array(7941, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8070, 'status' => 'F', 'lower' => array(7942, 953)); /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8071, 'status' => 'F', 'lower' => array(7943, 953)); /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8072, 'status' => 'F', 'lower' => array(7936, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8072, 'status' => 'S', 'lower' => array(8064)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8073, 'status' => 'F', 'lower' => array(7937, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8073, 'status' => 'S', 'lower' => array(8065)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8074, 'status' => 'F', 'lower' => array(7938, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8074, 'status' => 'S', 'lower' => array(8066)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8075, 'status' => 'F', 'lower' => array(7939, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8075, 'status' => 'S', 'lower' => array(8067)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8076, 'status' => 'F', 'lower' => array(7940, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8076, 'status' => 'S', 'lower' => array(8068)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8077, 'status' => 'F', 'lower' => array(7941, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8077, 'status' => 'S', 'lower' => array(8069)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8078, 'status' => 'F', 'lower' => array(7942, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8078, 'status' => 'S', 'lower' => array(8070)); /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8079, 'status' => 'F', 'lower' => array(7943, 953)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8079, 'status' => 'S', 'lower' => array(8071)); /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8080, 'status' => 'F', 'lower' => array(7968, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8081, 'status' => 'F', 'lower' => array(7969, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8082, 'status' => 'F', 'lower' => array(7970, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8083, 'status' => 'F', 'lower' => array(7971, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8084, 'status' => 'F', 'lower' => array(7972, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8085, 'status' => 'F', 'lower' => array(7973, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8086, 'status' => 'F', 'lower' => array(7974, 953)); /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8087, 'status' => 'F', 'lower' => array(7975, 953)); /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8088, 'status' => 'F', 'lower' => array(7968, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8088, 'status' => 'S', 'lower' => array(8080)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8089, 'status' => 'F', 'lower' => array(7969, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8089, 'status' => 'S', 'lower' => array(8081)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8090, 'status' => 'F', 'lower' => array(7970, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8090, 'status' => 'S', 'lower' => array(8082)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8091, 'status' => 'F', 'lower' => array(7971, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8091, 'status' => 'S', 'lower' => array(8083)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8092, 'status' => 'F', 'lower' => array(7972, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8092, 'status' => 'S', 'lower' => array(8084)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8093, 'status' => 'F', 'lower' => array(7973, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8093, 'status' => 'S', 'lower' => array(8085)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8094, 'status' => 'F', 'lower' => array(7974, 953)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8094, 'status' => 'S', 'lower' => array(8086)); /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8095, 'status' => 'F', 'lower' => array(7975, 953)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8095, 'status' => 'S', 'lower' => array(8087)); /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8096, 'status' => 'F', 'lower' => array(8032, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8097, 'status' => 'F', 'lower' => array(8033, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8098, 'status' => 'F', 'lower' => array(8034, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8099, 'status' => 'F', 'lower' => array(8035, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8100, 'status' => 'F', 'lower' => array(8036, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8101, 'status' => 'F', 'lower' => array(8037, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8102, 'status' => 'F', 'lower' => array(8038, 953)); /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8103, 'status' => 'F', 'lower' => array(8039, 953)); /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8104, 'status' => 'F', 'lower' => array(8032, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8104, 'status' => 'S', 'lower' => array(8096)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8105, 'status' => 'F', 'lower' => array(8033, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8105, 'status' => 'S', 'lower' => array(8097)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8106, 'status' => 'F', 'lower' => array(8034, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8106, 'status' => 'S', 'lower' => array(8098)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8107, 'status' => 'F', 'lower' => array(8035, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8107, 'status' => 'S', 'lower' => array(8099)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8108, 'status' => 'F', 'lower' => array(8036, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8108, 'status' => 'S', 'lower' => array(8100)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8109, 'status' => 'F', 'lower' => array(8037, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8109, 'status' => 'S', 'lower' => array(8101)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8110, 'status' => 'F', 'lower' => array(8038, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8110, 'status' => 'S', 'lower' => array(8102)); /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8111, 'status' => 'F', 'lower' => array(8039, 953)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8111, 'status' => 'S', 'lower' => array(8103)); /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8114, 'status' => 'F', 'lower' => array(8048, 953)); /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8115, 'status' => 'F', 'lower' => array(945, 953)); /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8116, 'status' => 'F', 'lower' => array(940, 953)); /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8118, 'status' => 'F', 'lower' => array(945, 834)); /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8119, 'status' => 'F', 'lower' => array(945, 834, 953)); /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8120, 'status' => 'C', 'lower' => array(8112)); /* GREEK CAPITAL LETTER ALPHA WITH VRACHY */ +$config['1f00_1fff'][] = array('upper' => 8121, 'status' => 'C', 'lower' => array(8113)); /* GREEK CAPITAL LETTER ALPHA WITH MACRON */ +$config['1f00_1fff'][] = array('upper' => 8122, 'status' => 'C', 'lower' => array(8048)); /* GREEK CAPITAL LETTER ALPHA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8123, 'status' => 'C', 'lower' => array(8049)); /* GREEK CAPITAL LETTER ALPHA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8124, 'status' => 'F', 'lower' => array(945, 953)); /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8124, 'status' => 'S', 'lower' => array(8115)); /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8126, 'status' => 'C', 'lower' => array(953)); /* GREEK PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8130, 'status' => 'F', 'lower' => array(8052, 953)); /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8131, 'status' => 'F', 'lower' => array(951, 953)); /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8132, 'status' => 'F', 'lower' => array(942, 953)); /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8134, 'status' => 'F', 'lower' => array(951, 834)); /* GREEK SMALL LETTER ETA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8135, 'status' => 'F', 'lower' => array(951, 834, 953)); /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8136, 'status' => 'C', 'lower' => array(8050)); /* GREEK CAPITAL LETTER EPSILON WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8137, 'status' => 'C', 'lower' => array(8051)); /* GREEK CAPITAL LETTER EPSILON WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8138, 'status' => 'C', 'lower' => array(8052)); /* GREEK CAPITAL LETTER ETA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8139, 'status' => 'C', 'lower' => array(8053)); /* GREEK CAPITAL LETTER ETA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8140, 'status' => 'F', 'lower' => array(951, 953)); /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8140, 'status' => 'S', 'lower' => array(8131)); /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8146, 'status' => 'F', 'lower' => array(953, 776, 768)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8147, 'status' => 'F', 'lower' => array(953, 776, 769)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8150, 'status' => 'F', 'lower' => array(953, 834)); /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8151, 'status' => 'F', 'lower' => array(953, 776, 834)); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8152, 'status' => 'C', 'lower' => array(8144)); /* GREEK CAPITAL LETTER IOTA WITH VRACHY */ +$config['1f00_1fff'][] = array('upper' => 8153, 'status' => 'C', 'lower' => array(8145)); /* GREEK CAPITAL LETTER IOTA WITH MACRON */ +$config['1f00_1fff'][] = array('upper' => 8154, 'status' => 'C', 'lower' => array(8054)); /* GREEK CAPITAL LETTER IOTA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8155, 'status' => 'C', 'lower' => array(8055)); /* GREEK CAPITAL LETTER IOTA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8162, 'status' => 'F', 'lower' => array(965, 776, 768)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */ +$config['1f00_1fff'][] = array('upper' => 8163, 'status' => 'F', 'lower' => array(965, 776, 769)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */ +$config['1f00_1fff'][] = array('upper' => 8164, 'status' => 'F', 'lower' => array(961, 787)); /* GREEK SMALL LETTER RHO WITH PSILI */ +$config['1f00_1fff'][] = array('upper' => 8166, 'status' => 'F', 'lower' => array(965, 834)); /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8167, 'status' => 'F', 'lower' => array(965, 776, 834)); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8168, 'status' => 'C', 'lower' => array(8160)); /* GREEK CAPITAL LETTER UPSILON WITH VRACHY */ +$config['1f00_1fff'][] = array('upper' => 8169, 'status' => 'C', 'lower' => array(8161)); /* GREEK CAPITAL LETTER UPSILON WITH MACRON */ +$config['1f00_1fff'][] = array('upper' => 8170, 'status' => 'C', 'lower' => array(8058)); /* GREEK CAPITAL LETTER UPSILON WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8171, 'status' => 'C', 'lower' => array(8059)); /* GREEK CAPITAL LETTER UPSILON WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8172, 'status' => 'C', 'lower' => array(8165)); /* GREEK CAPITAL LETTER RHO WITH DASIA */ +$config['1f00_1fff'][] = array('upper' => 8178, 'status' => 'F', 'lower' => array(8060, 953)); /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8179, 'status' => 'F', 'lower' => array(969, 953)); /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8180, 'status' => 'F', 'lower' => array(974, 953)); /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8182, 'status' => 'F', 'lower' => array(969, 834)); /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */ +$config['1f00_1fff'][] = array('upper' => 8183, 'status' => 'F', 'lower' => array(969, 834, 953)); /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8184, 'status' => 'C', 'lower' => array(8056)); /* GREEK CAPITAL LETTER OMICRON WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8185, 'status' => 'C', 'lower' => array(8057)); /* GREEK CAPITAL LETTER OMICRON WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8186, 'status' => 'C', 'lower' => array(8060)); /* GREEK CAPITAL LETTER OMEGA WITH VARIA */ +$config['1f00_1fff'][] = array('upper' => 8187, 'status' => 'C', 'lower' => array(8061)); /* GREEK CAPITAL LETTER OMEGA WITH OXIA */ +$config['1f00_1fff'][] = array('upper' => 8188, 'status' => 'F', 'lower' => array(969, 953)); /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */ +$config['1f00_1fff'][] = array('upper' => 8188, 'status' => 'S', 'lower' => array(8179)); /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2100_214f.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2100_214f.php new file mode 100644 index 000000000..e0023500e --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2100_214f.php @@ -0,0 +1,45 @@ + 8486, 'status' => 'C', 'lower' => array(969)); /* OHM SIGN */ +$config['2100_214f'][] = array('upper' => 8490, 'status' => 'C', 'lower' => array(107)); /* KELVIN SIGN */ +$config['2100_214f'][] = array('upper' => 8491, 'status' => 'C', 'lower' => array(229)); /* ANGSTROM SIGN */ +$config['2100_214f'][] = array('upper' => 8498, 'status' => 'C', 'lower' => array(8526)); /* TURNED CAPITAL F */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2150_218f.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2150_218f.php new file mode 100644 index 000000000..6a1e6855c --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2150_218f.php @@ -0,0 +1,58 @@ + 8544, 'status' => 'C', 'lower' => array(8560)); /* ROMAN NUMERAL ONE */ +$config['2150_218f'][] = array('upper' => 8545, 'status' => 'C', 'lower' => array(8561)); /* ROMAN NUMERAL TWO */ +$config['2150_218f'][] = array('upper' => 8546, 'status' => 'C', 'lower' => array(8562)); /* ROMAN NUMERAL THREE */ +$config['2150_218f'][] = array('upper' => 8547, 'status' => 'C', 'lower' => array(8563)); /* ROMAN NUMERAL FOUR */ +$config['2150_218f'][] = array('upper' => 8548, 'status' => 'C', 'lower' => array(8564)); /* ROMAN NUMERAL FIVE */ +$config['2150_218f'][] = array('upper' => 8549, 'status' => 'C', 'lower' => array(8565)); /* ROMAN NUMERAL SIX */ +$config['2150_218f'][] = array('upper' => 8550, 'status' => 'C', 'lower' => array(8566)); /* ROMAN NUMERAL SEVEN */ +$config['2150_218f'][] = array('upper' => 8551, 'status' => 'C', 'lower' => array(8567)); /* ROMAN NUMERAL EIGHT */ +$config['2150_218f'][] = array('upper' => 8552, 'status' => 'C', 'lower' => array(8568)); /* ROMAN NUMERAL NINE */ +$config['2150_218f'][] = array('upper' => 8553, 'status' => 'C', 'lower' => array(8569)); /* ROMAN NUMERAL TEN */ +$config['2150_218f'][] = array('upper' => 8554, 'status' => 'C', 'lower' => array(8570)); /* ROMAN NUMERAL ELEVEN */ +$config['2150_218f'][] = array('upper' => 8555, 'status' => 'C', 'lower' => array(8571)); /* ROMAN NUMERAL TWELVE */ +$config['2150_218f'][] = array('upper' => 8556, 'status' => 'C', 'lower' => array(8572)); /* ROMAN NUMERAL FIFTY */ +$config['2150_218f'][] = array('upper' => 8557, 'status' => 'C', 'lower' => array(8573)); /* ROMAN NUMERAL ONE HUNDRED */ +$config['2150_218f'][] = array('upper' => 8558, 'status' => 'C', 'lower' => array(8574)); /* ROMAN NUMERAL FIVE HUNDRED */ +$config['2150_218f'][] = array('upper' => 8559, 'status' => 'C', 'lower' => array(8575)); /* ROMAN NUMERAL ONE THOUSAND */ +$config['2150_218f'][] = array('upper' => 8579, 'status' => 'C', 'lower' => array(8580)); /* ROMAN NUMERAL REVERSED ONE HUNDRED */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2460_24ff.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2460_24ff.php new file mode 100644 index 000000000..3b8dee7b3 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2460_24ff.php @@ -0,0 +1,67 @@ + 9398, 'status' => 'C', 'lower' => array(9424)); /* CIRCLED LATIN CAPITAL LETTER A */ +$config['2460_24ff'][] = array('upper' => 9399, 'status' => 'C', 'lower' => array(9425)); /* CIRCLED LATIN CAPITAL LETTER B */ +$config['2460_24ff'][] = array('upper' => 9400, 'status' => 'C', 'lower' => array(9426)); /* CIRCLED LATIN CAPITAL LETTER C */ +$config['2460_24ff'][] = array('upper' => 9401, 'status' => 'C', 'lower' => array(9427)); /* CIRCLED LATIN CAPITAL LETTER D */ +$config['2460_24ff'][] = array('upper' => 9402, 'status' => 'C', 'lower' => array(9428)); /* CIRCLED LATIN CAPITAL LETTER E */ +$config['2460_24ff'][] = array('upper' => 9403, 'status' => 'C', 'lower' => array(9429)); /* CIRCLED LATIN CAPITAL LETTER F */ +$config['2460_24ff'][] = array('upper' => 9404, 'status' => 'C', 'lower' => array(9430)); /* CIRCLED LATIN CAPITAL LETTER G */ +$config['2460_24ff'][] = array('upper' => 9405, 'status' => 'C', 'lower' => array(9431)); /* CIRCLED LATIN CAPITAL LETTER H */ +$config['2460_24ff'][] = array('upper' => 9406, 'status' => 'C', 'lower' => array(9432)); /* CIRCLED LATIN CAPITAL LETTER I */ +$config['2460_24ff'][] = array('upper' => 9407, 'status' => 'C', 'lower' => array(9433)); /* CIRCLED LATIN CAPITAL LETTER J */ +$config['2460_24ff'][] = array('upper' => 9408, 'status' => 'C', 'lower' => array(9434)); /* CIRCLED LATIN CAPITAL LETTER K */ +$config['2460_24ff'][] = array('upper' => 9409, 'status' => 'C', 'lower' => array(9435)); /* CIRCLED LATIN CAPITAL LETTER L */ +$config['2460_24ff'][] = array('upper' => 9410, 'status' => 'C', 'lower' => array(9436)); /* CIRCLED LATIN CAPITAL LETTER M */ +$config['2460_24ff'][] = array('upper' => 9411, 'status' => 'C', 'lower' => array(9437)); /* CIRCLED LATIN CAPITAL LETTER N */ +$config['2460_24ff'][] = array('upper' => 9412, 'status' => 'C', 'lower' => array(9438)); /* CIRCLED LATIN CAPITAL LETTER O */ +$config['2460_24ff'][] = array('upper' => 9413, 'status' => 'C', 'lower' => array(9439)); /* CIRCLED LATIN CAPITAL LETTER P */ +$config['2460_24ff'][] = array('upper' => 9414, 'status' => 'C', 'lower' => array(9440)); /* CIRCLED LATIN CAPITAL LETTER Q */ +$config['2460_24ff'][] = array('upper' => 9415, 'status' => 'C', 'lower' => array(9441)); /* CIRCLED LATIN CAPITAL LETTER R */ +$config['2460_24ff'][] = array('upper' => 9416, 'status' => 'C', 'lower' => array(9442)); /* CIRCLED LATIN CAPITAL LETTER S */ +$config['2460_24ff'][] = array('upper' => 9417, 'status' => 'C', 'lower' => array(9443)); /* CIRCLED LATIN CAPITAL LETTER T */ +$config['2460_24ff'][] = array('upper' => 9418, 'status' => 'C', 'lower' => array(9444)); /* CIRCLED LATIN CAPITAL LETTER U */ +$config['2460_24ff'][] = array('upper' => 9419, 'status' => 'C', 'lower' => array(9445)); /* CIRCLED LATIN CAPITAL LETTER V */ +$config['2460_24ff'][] = array('upper' => 9420, 'status' => 'C', 'lower' => array(9446)); /* CIRCLED LATIN CAPITAL LETTER W */ +$config['2460_24ff'][] = array('upper' => 9421, 'status' => 'C', 'lower' => array(9447)); /* CIRCLED LATIN CAPITAL LETTER X */ +$config['2460_24ff'][] = array('upper' => 9422, 'status' => 'C', 'lower' => array(9448)); /* CIRCLED LATIN CAPITAL LETTER Y */ +$config['2460_24ff'][] = array('upper' => 9423, 'status' => 'C', 'lower' => array(9449)); /* CIRCLED LATIN CAPITAL LETTER Z */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c00_2c5f.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c00_2c5f.php new file mode 100644 index 000000000..7f80a4185 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c00_2c5f.php @@ -0,0 +1,88 @@ + 11264, 'status' => 'C', 'lower' => array(11312)); /* GLAGOLITIC CAPITAL LETTER AZU */ +$config['2c00_2c5f'][] = array('upper' => 11265, 'status' => 'C', 'lower' => array(11313)); /* GLAGOLITIC CAPITAL LETTER BUKY */ +$config['2c00_2c5f'][] = array('upper' => 11266, 'status' => 'C', 'lower' => array(11314)); /* GLAGOLITIC CAPITAL LETTER VEDE */ +$config['2c00_2c5f'][] = array('upper' => 11267, 'status' => 'C', 'lower' => array(11315)); /* GLAGOLITIC CAPITAL LETTER GLAGOLI */ +$config['2c00_2c5f'][] = array('upper' => 11268, 'status' => 'C', 'lower' => array(11316)); /* GLAGOLITIC CAPITAL LETTER DOBRO */ +$config['2c00_2c5f'][] = array('upper' => 11269, 'status' => 'C', 'lower' => array(11317)); /* GLAGOLITIC CAPITAL LETTER YESTU */ +$config['2c00_2c5f'][] = array('upper' => 11270, 'status' => 'C', 'lower' => array(11318)); /* GLAGOLITIC CAPITAL LETTER ZHIVETE */ +$config['2c00_2c5f'][] = array('upper' => 11271, 'status' => 'C', 'lower' => array(11319)); /* GLAGOLITIC CAPITAL LETTER DZELO */ +$config['2c00_2c5f'][] = array('upper' => 11272, 'status' => 'C', 'lower' => array(11320)); /* GLAGOLITIC CAPITAL LETTER ZEMLJA */ +$config['2c00_2c5f'][] = array('upper' => 11273, 'status' => 'C', 'lower' => array(11321)); /* GLAGOLITIC CAPITAL LETTER IZHE */ +$config['2c00_2c5f'][] = array('upper' => 11274, 'status' => 'C', 'lower' => array(11322)); /* GLAGOLITIC CAPITAL LETTER INITIAL IZHE */ +$config['2c00_2c5f'][] = array('upper' => 11275, 'status' => 'C', 'lower' => array(11323)); /* GLAGOLITIC CAPITAL LETTER I */ +$config['2c00_2c5f'][] = array('upper' => 11276, 'status' => 'C', 'lower' => array(11324)); /* GLAGOLITIC CAPITAL LETTER DJERVI */ +$config['2c00_2c5f'][] = array('upper' => 11277, 'status' => 'C', 'lower' => array(11325)); /* GLAGOLITIC CAPITAL LETTER KAKO */ +$config['2c00_2c5f'][] = array('upper' => 11278, 'status' => 'C', 'lower' => array(11326)); /* GLAGOLITIC CAPITAL LETTER LJUDIJE */ +$config['2c00_2c5f'][] = array('upper' => 11279, 'status' => 'C', 'lower' => array(11327)); /* GLAGOLITIC CAPITAL LETTER MYSLITE */ +$config['2c00_2c5f'][] = array('upper' => 11280, 'status' => 'C', 'lower' => array(11328)); /* GLAGOLITIC CAPITAL LETTER NASHI */ +$config['2c00_2c5f'][] = array('upper' => 11281, 'status' => 'C', 'lower' => array(11329)); /* GLAGOLITIC CAPITAL LETTER ONU */ +$config['2c00_2c5f'][] = array('upper' => 11282, 'status' => 'C', 'lower' => array(11330)); /* GLAGOLITIC CAPITAL LETTER POKOJI */ +$config['2c00_2c5f'][] = array('upper' => 11283, 'status' => 'C', 'lower' => array(11331)); /* GLAGOLITIC CAPITAL LETTER RITSI */ +$config['2c00_2c5f'][] = array('upper' => 11284, 'status' => 'C', 'lower' => array(11332)); /* GLAGOLITIC CAPITAL LETTER SLOVO */ +$config['2c00_2c5f'][] = array('upper' => 11285, 'status' => 'C', 'lower' => array(11333)); /* GLAGOLITIC CAPITAL LETTER TVRIDO */ +$config['2c00_2c5f'][] = array('upper' => 11286, 'status' => 'C', 'lower' => array(11334)); /* GLAGOLITIC CAPITAL LETTER UKU */ +$config['2c00_2c5f'][] = array('upper' => 11287, 'status' => 'C', 'lower' => array(11335)); /* GLAGOLITIC CAPITAL LETTER FRITU */ +$config['2c00_2c5f'][] = array('upper' => 11288, 'status' => 'C', 'lower' => array(11336)); /* GLAGOLITIC CAPITAL LETTER HERU */ +$config['2c00_2c5f'][] = array('upper' => 11289, 'status' => 'C', 'lower' => array(11337)); /* GLAGOLITIC CAPITAL LETTER OTU */ +$config['2c00_2c5f'][] = array('upper' => 11290, 'status' => 'C', 'lower' => array(11338)); /* GLAGOLITIC CAPITAL LETTER PE */ +$config['2c00_2c5f'][] = array('upper' => 11291, 'status' => 'C', 'lower' => array(11339)); /* GLAGOLITIC CAPITAL LETTER SHTA */ +$config['2c00_2c5f'][] = array('upper' => 11292, 'status' => 'C', 'lower' => array(11340)); /* GLAGOLITIC CAPITAL LETTER TSI */ +$config['2c00_2c5f'][] = array('upper' => 11293, 'status' => 'C', 'lower' => array(11341)); /* GLAGOLITIC CAPITAL LETTER CHRIVI */ +$config['2c00_2c5f'][] = array('upper' => 11294, 'status' => 'C', 'lower' => array(11342)); /* GLAGOLITIC CAPITAL LETTER SHA */ +$config['2c00_2c5f'][] = array('upper' => 11295, 'status' => 'C', 'lower' => array(11343)); /* GLAGOLITIC CAPITAL LETTER YERU */ +$config['2c00_2c5f'][] = array('upper' => 11296, 'status' => 'C', 'lower' => array(11344)); /* GLAGOLITIC CAPITAL LETTER YERI */ +$config['2c00_2c5f'][] = array('upper' => 11297, 'status' => 'C', 'lower' => array(11345)); /* GLAGOLITIC CAPITAL LETTER YATI */ +$config['2c00_2c5f'][] = array('upper' => 11298, 'status' => 'C', 'lower' => array(11346)); /* GLAGOLITIC CAPITAL LETTER SPIDERY HA */ +$config['2c00_2c5f'][] = array('upper' => 11299, 'status' => 'C', 'lower' => array(11347)); /* GLAGOLITIC CAPITAL LETTER YU */ +$config['2c00_2c5f'][] = array('upper' => 11300, 'status' => 'C', 'lower' => array(11348)); /* GLAGOLITIC CAPITAL LETTER SMALL YUS */ +$config['2c00_2c5f'][] = array('upper' => 11301, 'status' => 'C', 'lower' => array(11349)); /* GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL */ +$config['2c00_2c5f'][] = array('upper' => 11302, 'status' => 'C', 'lower' => array(11350)); /* GLAGOLITIC CAPITAL LETTER YO */ +$config['2c00_2c5f'][] = array('upper' => 11303, 'status' => 'C', 'lower' => array(11351)); /* GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS */ +$config['2c00_2c5f'][] = array('upper' => 11304, 'status' => 'C', 'lower' => array(11352)); /* GLAGOLITIC CAPITAL LETTER BIG YUS */ +$config['2c00_2c5f'][] = array('upper' => 11305, 'status' => 'C', 'lower' => array(11353)); /* GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS */ +$config['2c00_2c5f'][] = array('upper' => 11306, 'status' => 'C', 'lower' => array(11354)); /* GLAGOLITIC CAPITAL LETTER FITA */ +$config['2c00_2c5f'][] = array('upper' => 11307, 'status' => 'C', 'lower' => array(11355)); /* GLAGOLITIC CAPITAL LETTER IZHITSA */ +$config['2c00_2c5f'][] = array('upper' => 11308, 'status' => 'C', 'lower' => array(11356)); /* GLAGOLITIC CAPITAL LETTER SHTAPIC */ +$config['2c00_2c5f'][] = array('upper' => 11309, 'status' => 'C', 'lower' => array(11357)); /* GLAGOLITIC CAPITAL LETTER TROKUTASTI A */ +$config['2c00_2c5f'][] = array('upper' => 11310, 'status' => 'C', 'lower' => array(11358)); /* GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c60_2c7f.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c60_2c7f.php new file mode 100644 index 000000000..299cbdc0b --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c60_2c7f.php @@ -0,0 +1,49 @@ + 11360, 'status' => 'C', 'lower' => array(11361)); /* LATIN CAPITAL LETTER L WITH DOUBLE BAR */ +$config['2c60_2c7f'][] = array('upper' => 11362, 'status' => 'C', 'lower' => array(619)); /* LATIN CAPITAL LETTER L WITH MIDDLE TILDE */ +$config['2c60_2c7f'][] = array('upper' => 11363, 'status' => 'C', 'lower' => array(7549)); /* LATIN CAPITAL LETTER P WITH STROKE */ +$config['2c60_2c7f'][] = array('upper' => 11364, 'status' => 'C', 'lower' => array(637)); /* LATIN CAPITAL LETTER R WITH TAIL */ +$config['2c60_2c7f'][] = array('upper' => 11367, 'status' => 'C', 'lower' => array(11368)); /* LATIN CAPITAL LETTER H WITH DESCENDER */ +$config['2c60_2c7f'][] = array('upper' => 11369, 'status' => 'C', 'lower' => array(11370)); /* LATIN CAPITAL LETTER K WITH DESCENDER */ +$config['2c60_2c7f'][] = array('upper' => 11371, 'status' => 'C', 'lower' => array(11372)); /* LATIN CAPITAL LETTER Z WITH DESCENDER */ +$config['2c60_2c7f'][] = array('upper' => 11381, 'status' => 'C', 'lower' => array(11382)); /* LATIN CAPITAL LETTER HALF H */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c80_2cff.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c80_2cff.php new file mode 100644 index 000000000..3836c6451 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/2c80_2cff.php @@ -0,0 +1,91 @@ + 11392, 'status' => 'C', 'lower' => array(11393)); /* COPTIC CAPITAL LETTER ALFA */ +$config['2c80_2cff'][] = array('upper' => 11394, 'status' => 'C', 'lower' => array(11395)); /* COPTIC CAPITAL LETTER VIDA */ +$config['2c80_2cff'][] = array('upper' => 11396, 'status' => 'C', 'lower' => array(11397)); /* COPTIC CAPITAL LETTER GAMMA */ +$config['2c80_2cff'][] = array('upper' => 11398, 'status' => 'C', 'lower' => array(11399)); /* COPTIC CAPITAL LETTER DALDA */ +$config['2c80_2cff'][] = array('upper' => 11400, 'status' => 'C', 'lower' => array(11401)); /* COPTIC CAPITAL LETTER EIE */ +$config['2c80_2cff'][] = array('upper' => 11402, 'status' => 'C', 'lower' => array(11403)); /* COPTIC CAPITAL LETTER SOU */ +$config['2c80_2cff'][] = array('upper' => 11404, 'status' => 'C', 'lower' => array(11405)); /* COPTIC CAPITAL LETTER ZATA */ +$config['2c80_2cff'][] = array('upper' => 11406, 'status' => 'C', 'lower' => array(11407)); /* COPTIC CAPITAL LETTER HATE */ +$config['2c80_2cff'][] = array('upper' => 11408, 'status' => 'C', 'lower' => array(11409)); /* COPTIC CAPITAL LETTER THETHE */ +$config['2c80_2cff'][] = array('upper' => 11410, 'status' => 'C', 'lower' => array(11411)); /* COPTIC CAPITAL LETTER IAUDA */ +$config['2c80_2cff'][] = array('upper' => 11412, 'status' => 'C', 'lower' => array(11413)); /* COPTIC CAPITAL LETTER KAPA */ +$config['2c80_2cff'][] = array('upper' => 11414, 'status' => 'C', 'lower' => array(11415)); /* COPTIC CAPITAL LETTER LAULA */ +$config['2c80_2cff'][] = array('upper' => 11416, 'status' => 'C', 'lower' => array(11417)); /* COPTIC CAPITAL LETTER MI */ +$config['2c80_2cff'][] = array('upper' => 11418, 'status' => 'C', 'lower' => array(11419)); /* COPTIC CAPITAL LETTER NI */ +$config['2c80_2cff'][] = array('upper' => 11420, 'status' => 'C', 'lower' => array(11421)); /* COPTIC CAPITAL LETTER KSI */ +$config['2c80_2cff'][] = array('upper' => 11422, 'status' => 'C', 'lower' => array(11423)); /* COPTIC CAPITAL LETTER O */ +$config['2c80_2cff'][] = array('upper' => 11424, 'status' => 'C', 'lower' => array(11425)); /* COPTIC CAPITAL LETTER PI */ +$config['2c80_2cff'][] = array('upper' => 11426, 'status' => 'C', 'lower' => array(11427)); /* COPTIC CAPITAL LETTER RO */ +$config['2c80_2cff'][] = array('upper' => 11428, 'status' => 'C', 'lower' => array(11429)); /* COPTIC CAPITAL LETTER SIMA */ +$config['2c80_2cff'][] = array('upper' => 11430, 'status' => 'C', 'lower' => array(11431)); /* COPTIC CAPITAL LETTER TAU */ +$config['2c80_2cff'][] = array('upper' => 11432, 'status' => 'C', 'lower' => array(11433)); /* COPTIC CAPITAL LETTER UA */ +$config['2c80_2cff'][] = array('upper' => 11434, 'status' => 'C', 'lower' => array(11435)); /* COPTIC CAPITAL LETTER FI */ +$config['2c80_2cff'][] = array('upper' => 11436, 'status' => 'C', 'lower' => array(11437)); /* COPTIC CAPITAL LETTER KHI */ +$config['2c80_2cff'][] = array('upper' => 11438, 'status' => 'C', 'lower' => array(11439)); /* COPTIC CAPITAL LETTER PSI */ +$config['2c80_2cff'][] = array('upper' => 11440, 'status' => 'C', 'lower' => array(11441)); /* COPTIC CAPITAL LETTER OOU */ +$config['2c80_2cff'][] = array('upper' => 11442, 'status' => 'C', 'lower' => array(11443)); /* COPTIC CAPITAL LETTER DIALECT-P ALEF */ +$config['2c80_2cff'][] = array('upper' => 11444, 'status' => 'C', 'lower' => array(11445)); /* COPTIC CAPITAL LETTER OLD COPTIC AIN */ +$config['2c80_2cff'][] = array('upper' => 11446, 'status' => 'C', 'lower' => array(11447)); /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE */ +$config['2c80_2cff'][] = array('upper' => 11448, 'status' => 'C', 'lower' => array(11449)); /* COPTIC CAPITAL LETTER DIALECT-P KAPA */ +$config['2c80_2cff'][] = array('upper' => 11450, 'status' => 'C', 'lower' => array(11451)); /* COPTIC CAPITAL LETTER DIALECT-P NI */ +$config['2c80_2cff'][] = array('upper' => 11452, 'status' => 'C', 'lower' => array(11453)); /* COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI */ +$config['2c80_2cff'][] = array('upper' => 11454, 'status' => 'C', 'lower' => array(11455)); /* COPTIC CAPITAL LETTER OLD COPTIC OOU */ +$config['2c80_2cff'][] = array('upper' => 11456, 'status' => 'C', 'lower' => array(11457)); /* COPTIC CAPITAL LETTER SAMPI */ +$config['2c80_2cff'][] = array('upper' => 11458, 'status' => 'C', 'lower' => array(11459)); /* COPTIC CAPITAL LETTER CROSSED SHEI */ +$config['2c80_2cff'][] = array('upper' => 11460, 'status' => 'C', 'lower' => array(11461)); /* COPTIC CAPITAL LETTER OLD COPTIC SHEI */ +$config['2c80_2cff'][] = array('upper' => 11462, 'status' => 'C', 'lower' => array(11463)); /* COPTIC CAPITAL LETTER OLD COPTIC ESH */ +$config['2c80_2cff'][] = array('upper' => 11464, 'status' => 'C', 'lower' => array(11465)); /* COPTIC CAPITAL LETTER AKHMIMIC KHEI */ +$config['2c80_2cff'][] = array('upper' => 11466, 'status' => 'C', 'lower' => array(11467)); /* COPTIC CAPITAL LETTER DIALECT-P HORI */ +$config['2c80_2cff'][] = array('upper' => 11468, 'status' => 'C', 'lower' => array(11469)); /* COPTIC CAPITAL LETTER OLD COPTIC HORI */ +$config['2c80_2cff'][] = array('upper' => 11470, 'status' => 'C', 'lower' => array(11471)); /* COPTIC CAPITAL LETTER OLD COPTIC HA */ +$config['2c80_2cff'][] = array('upper' => 11472, 'status' => 'C', 'lower' => array(11473)); /* COPTIC CAPITAL LETTER L-SHAPED HA */ +$config['2c80_2cff'][] = array('upper' => 11474, 'status' => 'C', 'lower' => array(11475)); /* COPTIC CAPITAL LETTER OLD COPTIC HEI */ +$config['2c80_2cff'][] = array('upper' => 11476, 'status' => 'C', 'lower' => array(11477)); /* COPTIC CAPITAL LETTER OLD COPTIC HAT */ +$config['2c80_2cff'][] = array('upper' => 11478, 'status' => 'C', 'lower' => array(11479)); /* COPTIC CAPITAL LETTER OLD COPTIC GANGIA */ +$config['2c80_2cff'][] = array('upper' => 11480, 'status' => 'C', 'lower' => array(11481)); /* COPTIC CAPITAL LETTER OLD COPTIC DJA */ +$config['2c80_2cff'][] = array('upper' => 11482, 'status' => 'C', 'lower' => array(11483)); /* COPTIC CAPITAL LETTER OLD COPTIC SHIMA */ +$config['2c80_2cff'][] = array('upper' => 11484, 'status' => 'C', 'lower' => array(11485)); /* COPTIC CAPITAL LETTER OLD NUBIAN SHIMA */ +$config['2c80_2cff'][] = array('upper' => 11486, 'status' => 'C', 'lower' => array(11487)); /* COPTIC CAPITAL LETTER OLD NUBIAN NGI */ +$config['2c80_2cff'][] = array('upper' => 11488, 'status' => 'C', 'lower' => array(11489)); /* COPTIC CAPITAL LETTER OLD NUBIAN NYI */ +$config['2c80_2cff'][] = array('upper' => 11490, 'status' => 'C', 'lower' => array(11491)); /* COPTIC CAPITAL LETTER OLD NUBIAN WAU */ diff --git a/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/ff00_ffef.php b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/ff00_ffef.php new file mode 100644 index 000000000..1fbb85d97 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/config/unicode/casefolding/ff00_ffef.php @@ -0,0 +1,67 @@ + 65313, 'status' => 'C', 'lower' => array(65345)); /* FULLWIDTH LATIN CAPITAL LETTER A */ +$config['ff00_ffef'][] = array('upper' => 65314, 'status' => 'C', 'lower' => array(65346)); /* FULLWIDTH LATIN CAPITAL LETTER B */ +$config['ff00_ffef'][] = array('upper' => 65315, 'status' => 'C', 'lower' => array(65347)); /* FULLWIDTH LATIN CAPITAL LETTER C */ +$config['ff00_ffef'][] = array('upper' => 65316, 'status' => 'C', 'lower' => array(65348)); /* FULLWIDTH LATIN CAPITAL LETTER D */ +$config['ff00_ffef'][] = array('upper' => 65317, 'status' => 'C', 'lower' => array(65349)); /* FULLWIDTH LATIN CAPITAL LETTER E */ +$config['ff00_ffef'][] = array('upper' => 65318, 'status' => 'C', 'lower' => array(65350)); /* FULLWIDTH LATIN CAPITAL LETTER F */ +$config['ff00_ffef'][] = array('upper' => 65319, 'status' => 'C', 'lower' => array(65351)); /* FULLWIDTH LATIN CAPITAL LETTER G */ +$config['ff00_ffef'][] = array('upper' => 65320, 'status' => 'C', 'lower' => array(65352)); /* FULLWIDTH LATIN CAPITAL LETTER H */ +$config['ff00_ffef'][] = array('upper' => 65321, 'status' => 'C', 'lower' => array(65353)); /* FULLWIDTH LATIN CAPITAL LETTER I */ +$config['ff00_ffef'][] = array('upper' => 65322, 'status' => 'C', 'lower' => array(65354)); /* FULLWIDTH LATIN CAPITAL LETTER J */ +$config['ff00_ffef'][] = array('upper' => 65323, 'status' => 'C', 'lower' => array(65355)); /* FULLWIDTH LATIN CAPITAL LETTER K */ +$config['ff00_ffef'][] = array('upper' => 65324, 'status' => 'C', 'lower' => array(65356)); /* FULLWIDTH LATIN CAPITAL LETTER L */ +$config['ff00_ffef'][] = array('upper' => 65325, 'status' => 'C', 'lower' => array(65357)); /* FULLWIDTH LATIN CAPITAL LETTER M */ +$config['ff00_ffef'][] = array('upper' => 65326, 'status' => 'C', 'lower' => array(65358)); /* FULLWIDTH LATIN CAPITAL LETTER N */ +$config['ff00_ffef'][] = array('upper' => 65327, 'status' => 'C', 'lower' => array(65359)); /* FULLWIDTH LATIN CAPITAL LETTER O */ +$config['ff00_ffef'][] = array('upper' => 65328, 'status' => 'C', 'lower' => array(65360)); /* FULLWIDTH LATIN CAPITAL LETTER P */ +$config['ff00_ffef'][] = array('upper' => 65329, 'status' => 'C', 'lower' => array(65361)); /* FULLWIDTH LATIN CAPITAL LETTER Q */ +$config['ff00_ffef'][] = array('upper' => 65330, 'status' => 'C', 'lower' => array(65362)); /* FULLWIDTH LATIN CAPITAL LETTER R */ +$config['ff00_ffef'][] = array('upper' => 65331, 'status' => 'C', 'lower' => array(65363)); /* FULLWIDTH LATIN CAPITAL LETTER S */ +$config['ff00_ffef'][] = array('upper' => 65332, 'status' => 'C', 'lower' => array(65364)); /* FULLWIDTH LATIN CAPITAL LETTER T */ +$config['ff00_ffef'][] = array('upper' => 65333, 'status' => 'C', 'lower' => array(65365)); /* FULLWIDTH LATIN CAPITAL LETTER U */ +$config['ff00_ffef'][] = array('upper' => 65334, 'status' => 'C', 'lower' => array(65366)); /* FULLWIDTH LATIN CAPITAL LETTER V */ +$config['ff00_ffef'][] = array('upper' => 65335, 'status' => 'C', 'lower' => array(65367)); /* FULLWIDTH LATIN CAPITAL LETTER W */ +$config['ff00_ffef'][] = array('upper' => 65336, 'status' => 'C', 'lower' => array(65368)); /* FULLWIDTH LATIN CAPITAL LETTER X */ +$config['ff00_ffef'][] = array('upper' => 65337, 'status' => 'C', 'lower' => array(65369)); /* FULLWIDTH LATIN CAPITAL LETTER Y */ +$config['ff00_ffef'][] = array('upper' => 65338, 'status' => 'C', 'lower' => array(65370)); /* FULLWIDTH LATIN CAPITAL LETTER Z */ diff --git a/code/ryzom/tools/server/www/webtt/cake/console/cake b/code/ryzom/tools/server/www/webtt/cake/console/cake new file mode 100755 index 000000000..0c5f60f36 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/cake @@ -0,0 +1,26 @@ +#!/bin/bash +################################################################################ +# +# Bake is a shell script for running CakePHP bake script +# PHP versions 4 and 5 +# +# CakePHP(tm) : Rapid Development Framework (http://cakephp.org) +# Copyright 2005-2010, Cake Software Foundation, Inc. +# +# Licensed under The MIT License +# Redistributions of files must retain the above copyright notice. +# +# @copyright Copyright 2005-2010, Cake Software Foundation, Inc. +# @link http://cakephp.org CakePHP(tm) Project +# @package cake +# @subpackage cake.cake.console +# @since CakePHP(tm) v 1.2.0.5012 +# @license MIT License (http://www.opensource.org/licenses/mit-license.php) +# +################################################################################ +LIB=${0/%cake/} +APP=`pwd` + +exec php -q ${LIB}cake.php -working "${APP}" "$@" + +exit; \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/cake/console/cake.bat b/code/ryzom/tools/server/www/webtt/cake/console/cake.bat new file mode 100644 index 000000000..87ee1c7d9 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/cake.bat @@ -0,0 +1,33 @@ +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Bake is a shell script for running CakePHP bake script +:: PHP versions 4 and 5 +:: +:: CakePHP(tm) : Rapid Development Framework (http://cakephp.org) +:: Copyright 2005-2010, Cake Software Foundation, Inc. +:: +:: Licensed under The MIT License +:: Redistributions of files must retain the above copyright notice. +:: +:: @copyright Copyright 2005-2010, Cake Software Foundation, Inc. +:: @link http://cakephp.org CakePHP(tm) Project +:: @package cake +:: @subpackage cake.cake.console +:: @since CakePHP(tm) v 1.2.0.5012 +:: @license MIT License (http://www.opensource.org/licenses/mit-license.php) +:: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:: In order for this script to work as intended, the cake\console\ folder must be in your PATH + +@echo. +@echo off + +SET app=%0 +SET lib=%~dp0 + +php -q "%lib%cake.php" -working "%CD% " %* + +echo. + +exit /B %ERRORLEVEL% \ No newline at end of file diff --git a/code/ryzom/tools/server/www/webtt/cake/console/cake.php b/code/ryzom/tools/server/www/webtt/cake/console/cake.php new file mode 100644 index 000000000..a0a835568 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/cake.php @@ -0,0 +1,667 @@ +#!/usr/bin/php -q +__initConstants(); + $this->parseParams($args); + $this->_initEnvironment(); + $this->__buildPaths(); + $this->_stop($this->dispatch() === false ? 1 : 0); + } + +/** + * Defines core configuration. + * + * @access private + */ + function __initConstants() { + if (function_exists('ini_set')) { + ini_set('display_errors', '1'); + ini_set('error_reporting', E_ALL & ~E_DEPRECATED); + ini_set('html_errors', false); + ini_set('implicit_flush', true); + ini_set('max_execution_time', 0); + } + + if (!defined('CAKE_CORE_INCLUDE_PATH')) { + define('PHP5', (PHP_VERSION >= 5)); + define('DS', DIRECTORY_SEPARATOR); + define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__)))); + define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS); + define('DISABLE_DEFAULT_ERROR_HANDLING', false); + define('CAKEPHP_SHELL', true); + } + require_once(CORE_PATH . 'cake' . DS . 'basics.php'); + } + +/** + * Defines current working environment. + * + * @access protected + */ + function _initEnvironment() { + $this->stdin = fopen('php://stdin', 'r'); + $this->stdout = fopen('php://stdout', 'w'); + $this->stderr = fopen('php://stderr', 'w'); + + if (!$this->__bootstrap()) { + $this->stderr("\nCakePHP Console: "); + $this->stderr("\nUnable to load Cake core:"); + $this->stderr("\tMake sure " . DS . 'cake' . DS . 'libs exists in ' . CAKE_CORE_INCLUDE_PATH); + $this->_stop(); + } + + if (!isset($this->args[0]) || !isset($this->params['working'])) { + $this->stderr("\nCakePHP Console: "); + $this->stderr('This file has been loaded incorrectly and cannot continue.'); + $this->stderr('Please make sure that ' . DIRECTORY_SEPARATOR . 'cake' . DIRECTORY_SEPARATOR . 'console is in your system path,'); + $this->stderr('and check the manual for the correct usage of this command.'); + $this->stderr('(http://manual.cakephp.org/)'); + $this->_stop(); + } + + if (basename(__FILE__) != basename($this->args[0])) { + $this->stderr("\nCakePHP Console: "); + $this->stderr('Warning: the dispatcher may have been loaded incorrectly, which could lead to unexpected results...'); + if ($this->getInput('Continue anyway?', array('y', 'n'), 'y') == 'n') { + $this->_stop(); + } + } + + $this->shiftArgs(); + } + +/** + * Builds the shell paths. + * + * @access private + * @return void + */ + function __buildPaths() { + $paths = array(); + if (!class_exists('Folder')) { + require LIBS . 'folder.php'; + } + $plugins = App::objects('plugin', null, false); + foreach ((array)$plugins as $plugin) { + $pluginPath = App::pluginPath($plugin); + $path = $pluginPath . 'vendors' . DS . 'shells' . DS; + if (file_exists($path)) { + $paths[] = $path; + } + } + + $vendorPaths = array_values(App::path('vendors')); + foreach ($vendorPaths as $vendorPath) { + $path = rtrim($vendorPath, DS) . DS . 'shells' . DS; + if (file_exists($path)) { + $paths[] = $path; + } + } + + $this->shellPaths = array_values(array_unique(array_merge($paths, App::path('shells')))); + } + +/** + * Initializes the environment and loads the Cake core. + * + * @return boolean Success. + * @access private + */ + function __bootstrap() { + + define('ROOT', $this->params['root']); + define('APP_DIR', $this->params['app']); + define('APP_PATH', $this->params['working'] . DS); + define('WWW_ROOT', APP_PATH . $this->params['webroot'] . DS); + if (!is_dir(ROOT . DS . APP_DIR . DS . 'tmp')) { + define('TMP', CORE_PATH . 'cake' . DS . 'console' . DS . 'templates' . DS . 'skel' . DS . 'tmp' . DS); + } + + $includes = array( + CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'object.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'inflector.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'configure.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'file.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'cache.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'string.php', + CORE_PATH . 'cake' . DS . 'libs' . DS . 'class_registry.php', + CORE_PATH . 'cake' . DS . 'console' . DS . 'error.php' + ); + + foreach ($includes as $inc) { + if (!require($inc)) { + $this->stderr("Failed to load Cake core file {$inc}"); + return false; + } + } + + Configure::getInstance(file_exists(CONFIGS . 'bootstrap.php')); + + if (!file_exists(APP_PATH . 'config' . DS . 'core.php')) { + include_once CORE_PATH . 'cake' . DS . 'console' . DS . 'templates' . DS . 'skel' . DS . 'config' . DS . 'core.php'; + App::build(); + } + + return true; + } + +/** + * Clear the console + * + * @return void + * @access public + */ + function clear() { + if (empty($this->params['noclear'])) { + if ( DS === '/') { + passthru('clear'); + } else { + passthru('cls'); + } + } + } + +/** + * Dispatches a CLI request + * + * @return boolean + * @access public + */ + function dispatch() { + $arg = $this->shiftArgs(); + + if (!$arg) { + $this->help(); + return false; + } + if ($arg == 'help') { + $this->help(); + return true; + } + + list($plugin, $shell) = pluginSplit($arg); + $this->shell = $shell; + $this->shellName = Inflector::camelize($shell); + $this->shellClass = $this->shellName . 'Shell'; + + $arg = null; + + if (isset($this->args[0])) { + $arg = $this->args[0]; + $this->shellCommand = Inflector::variable($arg); + } + + $Shell = $this->_getShell($plugin); + + if (!$Shell) { + $title = sprintf(__('Error: Class %s could not be loaded.', true), $this->shellClass); + $this->stderr($title . "\n"); + return false; + } + + $methods = array(); + + if (is_a($Shell, 'Shell')) { + $Shell->initialize(); + $Shell->loadTasks(); + + foreach ($Shell->taskNames as $task) { + if (is_a($Shell->{$task}, 'Shell')) { + $Shell->{$task}->initialize(); + $Shell->{$task}->loadTasks(); + } + } + + $task = Inflector::camelize($arg); + + if (in_array($task, $Shell->taskNames)) { + $this->shiftArgs(); + $Shell->{$task}->startup(); + + if (isset($this->args[0]) && $this->args[0] == 'help') { + if (method_exists($Shell->{$task}, 'help')) { + $Shell->{$task}->help(); + } else { + $this->help(); + } + return true; + } + return $Shell->{$task}->execute(); + } + $methods = array_diff(get_class_methods('Shell'), array('help')); + } + $methods = array_diff(get_class_methods($Shell), $methods); + $added = in_array(strtolower($arg), array_map('strtolower', $methods)); + $private = $arg[0] == '_' && method_exists($Shell, $arg); + + if (!$private) { + if ($added) { + $this->shiftArgs(); + $Shell->startup(); + return $Shell->{$arg}(); + } + if (method_exists($Shell, 'main')) { + $Shell->startup(); + return $Shell->main(); + } + } + + $title = sprintf(__('Error: Unknown %1$s command %2$s.', true), $this->shellName, $arg); + $message = sprintf(__('For usage try `cake %s help`', true), $this->shell); + $this->stderr($title . "\n" . $message . "\n"); + return false; + } + +/** + * Get shell to use, either plugin shell or application shell + * + * All paths in the shellPaths property are searched. + * shell, shellPath and shellClass properties are taken into account. + * + * @param string $plugin Optionally the name of a plugin + * @return mixed False if no shell could be found or an object on success + * @access protected + */ + function _getShell($plugin = null) { + foreach ($this->shellPaths as $path) { + $this->shellPath = $path . $this->shell . '.php'; + $pluginShellPath = DS . $plugin . DS . 'vendors' . DS . 'shells' . DS; + + if ((strpos($path, $pluginShellPath) !== false || !$plugin) && file_exists($this->shellPath)) { + $loaded = true; + break; + } + } + if (!isset($loaded)) { + return false; + } + + if (!class_exists('Shell')) { + require CONSOLE_LIBS . 'shell.php'; + } + + if (!class_exists($this->shellClass)) { + require $this->shellPath; + } + if (!class_exists($this->shellClass)) { + return false; + } + $Shell = new $this->shellClass($this); + return $Shell; + } + +/** + * Prompts the user for input, and returns it. + * + * @param string $prompt Prompt text. + * @param mixed $options Array or string of options. + * @param string $default Default input value. + * @return Either the default value, or the user-provided input. + * @access public + */ + function getInput($prompt, $options = null, $default = null) { + if (!is_array($options)) { + $printOptions = ''; + } else { + $printOptions = '(' . implode('/', $options) . ')'; + } + + if ($default === null) { + $this->stdout($prompt . " $printOptions \n" . '> ', false); + } else { + $this->stdout($prompt . " $printOptions \n" . "[$default] > ", false); + } + $result = fgets($this->stdin); + + if ($result === false) { + exit; + } + $result = trim($result); + + if ($default != null && empty($result)) { + return $default; + } + return $result; + } + +/** + * Outputs to the stdout filehandle. + * + * @param string $string String to output. + * @param boolean $newline If true, the outputs gets an added newline. + * @return integer Returns the number of bytes output to stdout. + * @access public + */ + function stdout($string, $newline = true) { + if ($newline) { + return fwrite($this->stdout, $string . "\n"); + } else { + return fwrite($this->stdout, $string); + } + } + +/** + * Outputs to the stderr filehandle. + * + * @param string $string Error text to output. + * @access public + */ + function stderr($string) { + fwrite($this->stderr, $string); + } + +/** + * Parses command line options + * + * @param array $params Parameters to parse + * @access public + */ + function parseParams($params) { + $this->__parseParams($params); + $defaults = array('app' => 'app', 'root' => dirname(dirname(dirname(__FILE__))), 'working' => null, 'webroot' => 'webroot'); + $params = array_merge($defaults, array_intersect_key($this->params, $defaults)); + $isWin = false; + foreach ($defaults as $default => $value) { + if (strpos($params[$default], '\\') !== false) { + $isWin = true; + break; + } + } + $params = str_replace('\\', '/', $params); + + if (isset($params['working'])) { + $params['working'] = trim($params['working']); + } + if (!empty($params['working']) && (!isset($this->args[0]) || isset($this->args[0]) && $this->args[0]{0} !== '.')) { + if (empty($this->params['app']) && $params['working'] != $params['root']) { + $params['root'] = dirname($params['working']); + $params['app'] = basename($params['working']); + } else { + $params['root'] = $params['working']; + } + } + + if ($params['app'][0] == '/' || preg_match('/([a-z])(:)/i', $params['app'], $matches)) { + $params['root'] = dirname($params['app']); + } elseif (strpos($params['app'], '/')) { + $params['root'] .= '/' . dirname($params['app']); + } + + $params['app'] = basename($params['app']); + $params['working'] = rtrim($params['root'], '/'); + if (!$isWin || !preg_match('/^[A-Z]:$/i', $params['app'])) { + $params['working'] .= '/' . $params['app']; + } + + if (!empty($matches[0]) || !empty($isWin)) { + $params = str_replace('/', '\\', $params); + } + + $this->params = array_merge($this->params, $params); + } + +/** + * Helper for recursively parsing params + * + * @return array params + * @access private + */ + function __parseParams($params) { + $count = count($params); + for ($i = 0; $i < $count; $i++) { + if (isset($params[$i])) { + if ($params[$i]{0} === '-') { + $key = substr($params[$i], 1); + $this->params[$key] = true; + unset($params[$i]); + if (isset($params[++$i])) { + if ($params[$i]{0} !== '-') { + $this->params[$key] = str_replace('"', '', $params[$i]); + unset($params[$i]); + } else { + $i--; + $this->__parseParams($params); + } + } + } else { + $this->args[] = $params[$i]; + unset($params[$i]); + } + + } + } + } + +/** + * Removes first argument and shifts other arguments up + * + * @return mixed Null if there are no arguments otherwise the shifted argument + * @access public + */ + function shiftArgs() { + return array_shift($this->args); + } + +/** + * Shows console help + * + * @access public + */ + function help() { + $this->clear(); + $this->stdout("\nWelcome to CakePHP v" . Configure::version() . " Console"); + $this->stdout("---------------------------------------------------------------"); + $this->stdout("Current Paths:"); + $this->stdout(" -app: ". $this->params['app']); + $this->stdout(" -working: " . rtrim($this->params['working'], DS)); + $this->stdout(" -root: " . rtrim($this->params['root'], DS)); + $this->stdout(" -core: " . rtrim(CORE_PATH, DS)); + $this->stdout(""); + $this->stdout("Changing Paths:"); + $this->stdout("your working path should be the same as your application path"); + $this->stdout("to change your path use the '-app' param."); + $this->stdout("Example: -app relative/path/to/myapp or -app /absolute/path/to/myapp"); + + $this->stdout("\nAvailable Shells:"); + $shellList = array(); + foreach ($this->shellPaths as $path) { + if (!is_dir($path)) { + continue; + } + $shells = App::objects('file', $path); + if (empty($shells)) { + continue; + } + if (preg_match('@plugins[\\\/]([^\\\/]*)@', $path, $matches)) { + $type = Inflector::camelize($matches[1]); + } elseif (preg_match('@([^\\\/]*)[\\\/]vendors[\\\/]@', $path, $matches)) { + $type = $matches[1]; + } elseif (strpos($path, CAKE_CORE_INCLUDE_PATH . DS . 'cake') === 0) { + $type = 'CORE'; + } else { + $type = 'app'; + } + foreach ($shells as $shell) { + if ($shell !== 'shell.php') { + $shell = str_replace('.php', '', $shell); + $shellList[$shell][$type] = $type; + } + } + } + if ($shellList) { + ksort($shellList); + if (DS === '/') { + $width = exec('tput cols') - 2; + } + if (empty($width)) { + $width = 80; + } + $columns = max(1, floor($width / 30)); + $rows = ceil(count($shellList) / $columns); + + foreach ($shellList as $shell => $types) { + sort($types); + $shellList[$shell] = str_pad($shell . ' [' . implode ($types, ', ') . ']', $width / $columns); + } + $out = array_chunk($shellList, $rows); + for ($i = 0; $i < $rows; $i++) { + $row = ''; + for ($j = 0; $j < $columns; $j++) { + if (!isset($out[$j][$i])) { + continue; + } + $row .= $out[$j][$i]; + } + $this->stdout(" " . $row); + } + } + $this->stdout("\nTo run a command, type 'cake shell_name [args]'"); + $this->stdout("To get help on a specific command, type 'cake shell_name help'"); + } + +/** + * Stop execution of the current script + * + * @param $status see http://php.net/exit for values + * @return void + * @access protected + */ + function _stop($status = 0) { + exit($status); + } +} +if (!defined('DISABLE_AUTO_DISPATCH')) { + $dispatcher = new ShellDispatcher($argv); +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/error.php b/code/ryzom/tools/server/www/webtt/cake/console/error.php new file mode 100644 index 000000000..e837d1b8d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/error.php @@ -0,0 +1,265 @@ +stdout = fopen('php://stdout', 'w'); + $this->stderr = fopen('php://stderr', 'w'); + call_user_func_array(array(&$this, $method), $messages); + } + +/** + * Displays an error page (e.g. 404 Not found). + * + * @param array $params Parameters (code, name, and message) + * @access public + */ + function error($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr($code . $name . $message."\n"); + $this->_stop(1); + } + +/** + * Convenience method to display a 404 page. + * + * @param array $params Parameters (url, message) + * @access public + */ + function error404($params) { + extract($params, EXTR_OVERWRITE); + $this->error(array( + 'code' => '404', + 'name' => 'Not found', + 'message' => sprintf(__("The requested address %s was not found on this server.", true), $url, $message) + )); + $this->_stop(1); + } + +/** + * Renders the Missing Controller web page. + * + * @param array $params Parameters (className) + * @access public + */ + function missingController($params) { + extract($params, EXTR_OVERWRITE); + $controllerName = str_replace('Controller', '', $className); + $this->stderr(sprintf(__("Missing Controller '%s'", true), $controllerName)); + $this->_stop(1); + } + +/** + * Renders the Missing Action web page. + * + * @param array $params Parameters (action, className) + * @access public + */ + function missingAction($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Method '%s' in '%s'", true), $action, $className)); + $this->_stop(1); + } + +/** + * Renders the Private Action web page. + * + * @param array $params Parameters (action, className) + * @access public + */ + function privateAction($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Trying to access private method '%s' in '%s'", true), $action, $className)); + $this->_stop(1); + } + +/** + * Renders the Missing Table web page. + * + * @param array $params Parameters (table, className) + * @access public + */ + function missingTable($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing database table '%s' for model '%s'", true), $table, $className)); + $this->_stop(1); + } + +/** + * Renders the Missing Database web page. + * + * @param array $params Parameters + * @access public + */ + function missingDatabase($params = array()) { + $this->stderr(__("Missing Database", true)); + $this->_stop(1); + } + +/** + * Renders the Missing View web page. + * + * @param array $params Parameters (file, action, className) + * @access public + */ + function missingView($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing View '%s' for '%s' in '%s'", true), $file, $action, $className)); + $this->_stop(1); + } + +/** + * Renders the Missing Layout web page. + * + * @param array $params Parameters (file) + * @access public + */ + function missingLayout($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Layout '%s'", true), $file)); + $this->_stop(1); + } + +/** + * Renders the Database Connection web page. + * + * @param array $params Parameters + * @access public + */ + function missingConnection($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(__("Missing Database Connection. Try 'cake bake'", true)); + $this->_stop(1); + } + +/** + * Renders the Missing Helper file web page. + * + * @param array $params Parameters (file, helper) + * @access public + */ + function missingHelperFile($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Helper file '%s' for '%s'", true), $file, Inflector::camelize($helper))); + $this->_stop(1); + } + +/** + * Renders the Missing Helper class web page. + * + * @param array $params Parameters (file, helper) + * @access public + */ + function missingHelperClass($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Helper class '%s' in '%s'", true), Inflector::camelize($helper), $file)); + $this->_stop(1); + } + +/** + * Renders the Missing Component file web page. + * + * @param array $params Parameters (file, component) + * @access public + */ + function missingComponentFile($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Component file '%s' for '%s'", true), $file, Inflector::camelize($component))); + $this->_stop(1); + } + +/** + * Renders the Missing Component class web page. + * + * @param array $params Parameters (file, component) + * @access public + */ + function missingComponentClass($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing Component class '%s' in '%s'", true), Inflector::camelize($component), $file)); + $this->_stop(1); + } + +/** + * Renders the Missing Model class web page. + * + * @param array $params Parameters (className) + * @access public + */ + function missingModel($params) { + extract($params, EXTR_OVERWRITE); + $this->stderr(sprintf(__("Missing model '%s'", true), $className)); + $this->_stop(1); + } + +/** + * Outputs to the stdout filehandle. + * + * @param string $string String to output. + * @param boolean $newline If true, the outputs gets an added newline. + * @access public + */ + function stdout($string, $newline = true) { + if ($newline) { + fwrite($this->stdout, $string . "\n"); + } else { + fwrite($this->stdout, $string); + } + } + +/** + * Outputs to the stderr filehandle. + * + * @param string $string Error text to output. + * @access public + */ + function stderr($string) { + fwrite($this->stderr, "Error: ". $string . "\n"); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/acl.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/acl.php new file mode 100644 index 000000000..ddedd74d2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/acl.php @@ -0,0 +1,602 @@ +params['connection'])) { + $this->connection = $this->params['connection']; + } + + if (!in_array(Configure::read('Acl.classname'), array('DbAcl', 'DB_ACL'))) { + $out = "--------------------------------------------------\n"; + $out .= __("Error: Your current Cake configuration is set to", true) . "\n"; + $out .= __("an ACL implementation other than DB. Please change", true) . "\n"; + $out .= __("your core config to reflect your decision to use", true) . "\n"; + $out .= __("DbAcl before attempting to use this script", true) . ".\n"; + $out .= "--------------------------------------------------\n"; + $out .= sprintf(__("Current ACL Classname: %s", true), Configure::read('Acl.classname')) . "\n"; + $out .= "--------------------------------------------------\n"; + $this->err($out); + $this->_stop(); + } + + if ($this->command && !in_array($this->command, array('help'))) { + if (!config('database')) { + $this->out(__("Your database configuration was not found. Take a moment to create one.", true), true); + $this->args = null; + return $this->DbConfig->execute(); + } + require_once (CONFIGS.'database.php'); + + if (!in_array($this->command, array('initdb'))) { + $this->Acl =& new AclComponent(); + $controller = null; + $this->Acl->startup($controller); + } + } + } + +/** + * Override main() for help message hook + * + * @access public + */ + function main() { + $out = __("Available ACL commands:", true) . "\n"; + $out .= "\t - create\n"; + $out .= "\t - delete\n"; + $out .= "\t - setParent\n"; + $out .= "\t - getPath\n"; + $out .= "\t - check\n"; + $out .= "\t - grant\n"; + $out .= "\t - deny\n"; + $out .= "\t - inherit\n"; + $out .= "\t - view\n"; + $out .= "\t - initdb\n"; + $out .= "\t - help\n\n"; + $out .= __("For help, run the 'help' command. For help on a specific command, run 'help '", true); + $this->out($out); + } + +/** + * Creates an ARO/ACO node + * + * @access public + */ + function create() { + $this->_checkArgs(3, 'create'); + $this->checkNodeType(); + extract($this->__dataVars()); + + $class = ucfirst($this->args[0]); + $parent = $this->parseIdentifier($this->args[1]); + + if (!empty($parent) && $parent != '/' && $parent != 'root') { + $parent = $this->_getNodeId($class, $parent); + } else { + $parent = null; + } + + $data = $this->parseIdentifier($this->args[2]); + if (is_string($data) && $data != '/') { + $data = array('alias' => $data); + } elseif (is_string($data)) { + $this->error(__('/ can not be used as an alias!', true), __("\t/ is the root, please supply a sub alias", true)); + } + + $data['parent_id'] = $parent; + $this->Acl->{$class}->create(); + if ($this->Acl->{$class}->save($data)) { + $this->out(sprintf(__("New %s '%s' created.\n", true), $class, $this->args[2]), true); + } else { + $this->err(sprintf(__("There was a problem creating a new %s '%s'.", true), $class, $this->args[2])); + } + } + +/** + * Delete an ARO/ACO node. + * + * @access public + */ + function delete() { + $this->_checkArgs(2, 'delete'); + $this->checkNodeType(); + extract($this->__dataVars()); + + $identifier = $this->parseIdentifier($this->args[1]); + $nodeId = $this->_getNodeId($class, $identifier); + + if (!$this->Acl->{$class}->delete($nodeId)) { + $this->error(__("Node Not Deleted", true), sprintf(__("There was an error deleting the %s. Check that the node exists", true), $class) . ".\n"); + } + $this->out(sprintf(__("%s deleted", true), $class) . ".\n", true); + } + +/** + * Set parent for an ARO/ACO node. + * + * @access public + */ + function setParent() { + $this->_checkArgs(3, 'setParent'); + $this->checkNodeType(); + extract($this->__dataVars()); + $target = $this->parseIdentifier($this->args[1]); + $parent = $this->parseIdentifier($this->args[2]); + + $data = array( + $class => array( + 'id' => $this->_getNodeId($class, $target), + 'parent_id' => $this->_getNodeId($class, $parent) + ) + ); + $this->Acl->{$class}->create(); + if (!$this->Acl->{$class}->save($data)) { + $this->out(__("Error in setting new parent. Please make sure the parent node exists, and is not a descendant of the node specified.", true), true); + } else { + $this->out(sprintf(__("Node parent set to %s", true), $this->args[2]) . "\n", true); + } + } + +/** + * Get path to specified ARO/ACO node. + * + * @access public + */ + function getPath() { + $this->_checkArgs(2, 'getPath'); + $this->checkNodeType(); + extract($this->__dataVars()); + $identifier = $this->parseIdentifier($this->args[1]); + + $id = $this->_getNodeId($class, $identifier); + $nodes = $this->Acl->{$class}->getPath($id); + + if (empty($nodes)) { + $this->error( + sprintf(__("Supplied Node '%s' not found", true), $this->args[1]), + __("No tree returned.", true) + ); + } + $this->out(__('Path:', true)); + $this->hr(); + for ($i = 0; $i < count($nodes); $i++) { + $this->_outputNode($class, $nodes[$i], $i); + } + } + +/** + * Outputs a single node, Either using the alias or Model.key + * + * @param string $class Class name that is being used. + * @param array $node Array of node information. + * @param integer $indent indent level. + * @return void + * @access protected + */ + function _outputNode($class, $node, $indent) { + $indent = str_repeat(' ', $indent); + $data = $node[$class]; + if ($data['alias']) { + $this->out($indent . "[" . $data['id'] . "] " . $data['alias']); + } else { + $this->out($indent . "[" . $data['id'] . "] " . $data['model'] . '.' . $data['foreign_key']); + } + } + +/** + * Check permission for a given ARO to a given ACO. + * + * @access public + */ + function check() { + $this->_checkArgs(3, 'check'); + extract($this->__getParams()); + + if ($this->Acl->check($aro, $aco, $action)) { + $this->out(sprintf(__("%s is allowed.", true), $aroName), true); + } else { + $this->out(sprintf(__("%s is not allowed.", true), $aroName), true); + } + } + +/** + * Grant permission for a given ARO to a given ACO. + * + * @access public + */ + function grant() { + $this->_checkArgs(3, 'grant'); + extract($this->__getParams()); + + if ($this->Acl->allow($aro, $aco, $action)) { + $this->out(__("Permission granted.", true), true); + } else { + $this->out(__("Permission was not granted.", true), true); + } + } + +/** + * Deny access for an ARO to an ACO. + * + * @access public + */ + function deny() { + $this->_checkArgs(3, 'deny'); + extract($this->__getParams()); + + if ($this->Acl->deny($aro, $aco, $action)) { + $this->out(__("Permission denied.", true), true); + } else { + $this->out(__("Permission was not denied.", true), true); + } + } + +/** + * Set an ARO to inhermit permission to an ACO. + * + * @access public + */ + function inherit() { + $this->_checkArgs(3, 'inherit'); + extract($this->__getParams()); + + if ($this->Acl->inherit($aro, $aco, $action)) { + $this->out(__("Permission inherited.", true), true); + } else { + $this->out(__("Permission was not inherited.", true), true); + } + } + +/** + * Show a specific ARO/ACO node. + * + * @access public + */ + function view() { + $this->_checkArgs(1, 'view'); + $this->checkNodeType(); + extract($this->__dataVars()); + + if (isset($this->args[1])) { + $identity = $this->parseIdentifier($this->args[1]); + + $topNode = $this->Acl->{$class}->find('first', array( + 'conditions' => array($class . '.id' => $this->_getNodeId($class, $identity)) + )); + + $nodes = $this->Acl->{$class}->find('all', array( + 'conditions' => array( + $class . '.lft >=' => $topNode[$class]['lft'], + $class . '.lft <=' => $topNode[$class]['rght'] + ), + 'order' => $class . '.lft ASC' + )); + } else { + $nodes = $this->Acl->{$class}->find('all', array('order' => $class . '.lft ASC')); + } + + if (empty($nodes)) { + if (isset($this->args[1])) { + $this->error(sprintf(__("%s not found", true), $this->args[1]), __("No tree returned.", true)); + } elseif (isset($this->args[0])) { + $this->error(sprintf(__("%s not found", true), $this->args[0]), __("No tree returned.", true)); + } + } + $this->out($class . " tree:"); + $this->hr(); + + $stack = array(); + $last = null; + + foreach ($nodes as $n) { + $stack[] = $n; + if (!empty($last)) { + $end = end($stack); + if ($end[$class]['rght'] > $last) { + foreach ($stack as $k => $v) { + $end = end($stack); + if ($v[$class]['rght'] < $end[$class]['rght']) { + unset($stack[$k]); + } + } + } + } + $last = $n[$class]['rght']; + $count = count($stack); + + $this->_outputNode($class, $n, $count); + } + $this->hr(); + } + +/** + * Initialize ACL database. + * + * @access public + */ + function initdb() { + $this->Dispatch->args = array('schema', 'create', 'DbAcl'); + $this->Dispatch->dispatch(); + } + +/** + * Show help screen. + * + * @access public + */ + function help() { + $head = "-----------------------------------------------\n"; + $head .= __("Usage: cake acl ...", true) . "\n"; + $head .= "-----------------------------------------------\n"; + $head .= __("Commands:", true) . "\n"; + + $commands = array( + 'create' => "create aro|aco \n" . + "\t" . __("Creates a new ACL object under the parent", true) . "\n" . + "\t" . __("specified by , an id/alias.", true) . "\n" . + "\t" . __("The and references can be", true) . "\n" . + "\t" . __("in one of the following formats:", true) . "\n\n" . + "\t\t- " . __(". - The node will be bound to a", true) . "\n" . + "\t\t" . __("specific record of the given model.", true) . "\n\n" . + "\t\t- " . __(" - The node will be given a string alias,", true) . "\n" . + "\t\t" . __(" (or path, in the case of )", true) . "\n" . + "\t\t " . __("i.e. 'John'. When used with ,", true) . "\n" . + "\t\t" . __("this takes the form of an alias path,", true) . "\n" . + "\t\t " . __("i.e. //.", true) . "\n\n" . + "\t" . __("To add a node at the root level,", true) . "\n" . + "\t" . __("enter 'root' or '/' as the parameter.", true) . "\n", + + 'delete' => "delete aro|aco \n" . + "\t" . __("Deletes the ACL object with the given reference", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'setparent' => "setParent aro|aco \n" . + "\t" . __("Moves the ACL object specified by beneath", true) . "\n" . + "\t" . __("the parent ACL object specified by .", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'getpath' => "getPath aro|aco \n" . + "\t" . __("Returns the path to the ACL object specified by . This command", true) . "\n" . + "\t" . __("is useful in determining the inhertiance of permissions for a certain", true) . "\n" . + "\t" . __("object in the tree.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'check' => "check [] " . __("or", true) . " all\n" . + "\t" . __("Use this command to check ACL permissions.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'grant' => "grant [] " . __("or", true) . " all\n" . + "\t" . __("Use this command to grant ACL permissions. Once executed, the ARO", true) . "\n" . + "\t" . __("specified (and its children, if any) will have ALLOW access to the", true) . "\n" . + "\t" . __("specified ACO action (and the ACO's children, if any).", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'deny' => "deny []" . __("or", true) . " all\n" . + "\t" . __("Use this command to deny ACL permissions. Once executed, the ARO", true) . "\n" . + "\t" . __("specified (and its children, if any) will have DENY access to the", true) . "\n" . + "\t" . __("specified ACO action (and the ACO's children, if any).", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'inherit' => "inherit []" . __("or", true) . " all\n" . + "\t" . __("Use this command to force a child ARO object to inherit its", true) . "\n" . + "\t" . __("permissions settings from its parent.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'view' => "view aro|aco []\n" . + "\t" . __("The view command will return the ARO or ACO tree.", true) . "\n" . + "\t" . __("The optional node parameter allows you to return", true) . "\n" . + "\t" . __("only a portion of the requested tree.", true) . "\n" . + "\t" . __("For more detailed parameter usage info,", true) . "\n" . + "\t" . __("see help for the 'create' command.", true), + + 'initdb' => "initdb\n". + "\t" . __("Uses this command : cake schema run create DbAcl", true), + + 'help' => "help []\n" . + "\t" . __("Displays this help message, or a message on a specific command.", true) + ); + + $this->out($head); + if (!isset($this->args[0])) { + foreach ($commands as $cmd) { + $this->out("{$cmd}\n\n"); + } + } elseif (isset($commands[strtolower($this->args[0])])) { + $this->out($commands[strtolower($this->args[0])] . "\n\n"); + } else { + $this->out(sprintf(__("Command '%s' not found", true), $this->args[0])); + } + } + +/** + * Check that first argument specifies a valid Node type (ARO/ACO) + * + * @access public + */ + function checkNodeType() { + if (!isset($this->args[0])) { + return false; + } + if ($this->args[0] != 'aco' && $this->args[0] != 'aro') { + $this->error(sprintf(__("Missing/Unknown node type: '%s'", true), $this->args[0]), __('Please specify which ACL object type you wish to create. Either "aro" or "aco"', true)); + } + } + +/** + * Checks that given node exists + * + * @param string $type Node type (ARO/ACO) + * @param integer $id Node id + * @return boolean Success + * @access public + */ + function nodeExists() { + if (!$this->checkNodeType() && !isset($this->args[1])) { + return false; + } + extract($this->__dataVars($this->args[0])); + $key = is_numeric($this->args[1]) ? $secondary_id : 'alias'; + $conditions = array($class . '.' . $key => $this->args[1]); + $possibility = $this->Acl->{$class}->find('all', compact('conditions')); + if (empty($possibility)) { + $this->error(sprintf(__("%s not found", true), $this->args[1]), __("No tree returned.", true)); + } + return $possibility; + } + +/** + * Parse an identifier into Model.foriegnKey or an alias. + * Takes an identifier determines its type and returns the result as used by other methods. + * + * @param string $identifier Identifier to parse + * @return mixed a string for aliases, and an array for model.foreignKey + */ + function parseIdentifier($identifier) { + if (preg_match('/^([\w]+)\.(.*)$/', $identifier, $matches)) { + return array( + 'model' => $matches[1], + 'foreign_key' => $matches[2], + ); + } + return $identifier; + } + +/** + * Get the node for a given identifier. $identifier can either be a string alias + * or an array of properties to use in AcoNode::node() + * + * @param string $class Class type you want (Aro/Aco) + * @param mixed $identifier A mixed identifier for finding the node. + * @return int Integer of NodeId. Will trigger an error if nothing is found. + */ + function _getNodeId($class, $identifier) { + $node = $this->Acl->{$class}->node($identifier); + if (empty($node)) { + if (is_array($identifier)) { + $identifier = var_export($identifier, true); + } + $this->error(sprintf(__('Could not find node using reference "%s"', true), $identifier)); + } + return Set::extract($node, "0.{$class}.id"); + } + +/** + * get params for standard Acl methods + * + * @return array aro, aco, action + * @access private + */ + function __getParams() { + $aro = is_numeric($this->args[0]) ? intval($this->args[0]) : $this->args[0]; + $aco = is_numeric($this->args[1]) ? intval($this->args[1]) : $this->args[1]; + $aroName = $aro; + $acoName = $aco; + + if (is_string($aro)) { + $aro = $this->parseIdentifier($aro); + } + if (is_string($aco)) { + $aco = $this->parseIdentifier($aco); + } + $action = null; + if (isset($this->args[2])) { + $action = $this->args[2]; + if ($action == '' || $action == 'all') { + $action = '*'; + } + } + return compact('aro', 'aco', 'action', 'aroName', 'acoName'); + } + +/** + * Build data parameters based on node type + * + * @param string $type Node type (ARO/ACO) + * @return array Variables + * @access private + */ + function __dataVars($type = null) { + if ($type == null) { + $type = $this->args[0]; + } + $vars = array(); + $class = ucwords($type); + $vars['secondary_id'] = (strtolower($class) == 'aro') ? 'foreign_key' : 'object_id'; + $vars['data_name'] = $type; + $vars['table_name'] = $type . 's'; + $vars['class'] = $class; + return $vars; + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/api.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/api.php new file mode 100644 index 000000000..0b2c00529 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/api.php @@ -0,0 +1,213 @@ +paths = array_merge($this->paths, array( + 'behavior' => LIBS . 'model' . DS . 'behaviors' . DS, + 'cache' => LIBS . 'cache' . DS, + 'controller' => LIBS . 'controller' . DS, + 'component' => LIBS . 'controller' . DS . 'components' . DS, + 'helper' => LIBS . 'view' . DS . 'helpers' . DS, + 'model' => LIBS . 'model' . DS, + 'view' => LIBS . 'view' . DS, + 'core' => LIBS + )); + } + +/** + * Override main() to handle action + * + * @access public + */ + function main() { + if (empty($this->args)) { + return $this->help(); + } + + $type = strtolower($this->args[0]); + + if (isset($this->paths[$type])) { + $path = $this->paths[$type]; + } else { + $path = $this->paths['core']; + } + + if (count($this->args) == 1) { + $file = $type; + $class = Inflector::camelize($type); + } elseif (count($this->args) > 1) { + $file = Inflector::underscore($this->args[1]); + $class = Inflector::camelize($file); + } + + $objects = App::objects('class', $path); + if (in_array($class, $objects)) { + if (in_array($type, array('behavior', 'component', 'helper')) && $type !== $file) { + if (!preg_match('/' . Inflector::camelize($type) . '$/', $class)) { + $class .= Inflector::camelize($type); + } + } + + } else { + $this->err(sprintf(__("%s not found", true), $class)); + $this->_stop(); + } + + $parsed = $this->__parseClass($path . $file .'.php'); + + if (!empty($parsed)) { + if (isset($this->params['m'])) { + if (!isset($parsed[$this->params['m']])) { + $this->err(sprintf(__("%s::%s() could not be found", true), $class, $this->params['m'])); + $this->_stop(); + } + $method = $parsed[$this->params['m']]; + $this->out($class .'::'.$method['method'] . $method['parameters']); + $this->hr(); + $this->out($method['comment'], true); + } else { + $this->out(ucwords($class)); + $this->hr(); + $i = 0; + foreach ($parsed as $method) { + $list[] = ++$i . ". " . $method['method'] . $method['parameters']; + } + $this->out($list); + + $methods = array_keys($parsed); + while ($number = strtolower($this->in(__('Select a number to see the more information about a specific method. q to quit. l to list.', true), null, 'q'))) { + if ($number === 'q') { + $this->out(__('Done', true)); + $this->_stop(); + } + + if ($number === 'l') { + $this->out($list); + } + + if (isset($methods[--$number])) { + $method = $parsed[$methods[$number]]; + $this->hr(); + $this->out($class .'::'.$method['method'] . $method['parameters']); + $this->hr(); + $this->out($method['comment'], true); + } + } + } + } + } + +/** + * Show help for this shell. + * + * @access public + */ + function help() { + $head = "Usage: cake api [] [-m ]\n"; + $head .= "-----------------------------------------------\n"; + $head .= "Parameters:\n\n"; + + $commands = array( + 'path' => "\t\n" . + "\t\tEither a full path or type of class (model, behavior, controller, component, view, helper).\n". + "\t\tAvailable values:\n\n". + "\t\tbehavior\tLook for class in CakePHP behavior path\n". + "\t\tcache\tLook for class in CakePHP cache path\n". + "\t\tcontroller\tLook for class in CakePHP controller path\n". + "\t\tcomponent\tLook for class in CakePHP component path\n". + "\t\thelper\tLook for class in CakePHP helper path\n". + "\t\tmodel\tLook for class in CakePHP model path\n". + "\t\tview\tLook for class in CakePHP view path\n", + 'className' => "\t\n" . + "\t\tA CakePHP core class name (e.g: Component, HtmlHelper).\n" + ); + + $this->out($head); + if (!isset($this->args[1])) { + foreach ($commands as $cmd) { + $this->out("{$cmd}\n\n"); + } + } elseif (isset($commands[strtolower($this->args[1])])) { + $this->out($commands[strtolower($this->args[1])] . "\n\n"); + } else { + $this->out("Command '" . $this->args[1] . "' not found"); + } + } + +/** + * Parse a given class (located on given file) and get public methods and their + * signatures. + * + * @param object $File File object + * @param string $class Class name + * @return array Methods and signatures indexed by method name + * @access private + */ + function __parseClass($path) { + $parsed = array(); + + $File = new File($path); + if (!$File->exists()) { + $this->err(sprintf(__("%s could not be found", true), $File->name)); + $this->_stop(); + } + + $contents = $File->read(); + + if (preg_match_all('%(/\\*\\*[\\s\\S]*?\\*/)(\\s+function\\s+\\w+)(\\(.*\\))%', $contents, $result, PREG_PATTERN_ORDER)) { + foreach ($result[2] as $key => $method) { + $method = str_replace('function ', '', trim($method)); + + if (strpos($method, '__') === false && $method[0] != '_') { + $parsed[$method] = array( + 'comment' => str_replace(array('/*', '*/', '*'), '', trim($result[1][$key])), + 'method' => $method, + 'parameters' => trim($result[3][$key]) + ); + } + } + } + ksort($parsed); + return $parsed; + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/bake.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/bake.php new file mode 100644 index 000000000..874957268 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/bake.php @@ -0,0 +1,230 @@ +command); + if (isset($this->{$task}) && !in_array($task, array('Project', 'DbConfig'))) { + if (isset($this->params['connection'])) { + $this->{$task}->connection = $this->params['connection']; + } + foreach($this->args as $i => $arg) { + if (strpos($arg, '.')) { + list($this->params['plugin'], $this->args[$i]) = pluginSplit($arg); + break; + } + } + if (isset($this->params['plugin'])) { + $this->{$task}->plugin = $this->params['plugin']; + } + } + } + +/** + * Override main() to handle action + * + * @access public + */ + function main() { + if (!is_dir($this->DbConfig->path)) { + if ($this->Project->execute()) { + $this->DbConfig->path = $this->params['working'] . DS . 'config' . DS; + } else { + return false; + } + } + + if (!config('database')) { + $this->out(__("Your database configuration was not found. Take a moment to create one.", true)); + $this->args = null; + return $this->DbConfig->execute(); + } + $this->out('Interactive Bake Shell'); + $this->hr(); + $this->out('[D]atabase Configuration'); + $this->out('[M]odel'); + $this->out('[V]iew'); + $this->out('[C]ontroller'); + $this->out('[P]roject'); + $this->out('[F]ixture'); + $this->out('[T]est case'); + $this->out('[Q]uit'); + + $classToBake = strtoupper($this->in(__('What would you like to Bake?', true), array('D', 'M', 'V', 'C', 'P', 'F', 'T', 'Q'))); + switch ($classToBake) { + case 'D': + $this->DbConfig->execute(); + break; + case 'M': + $this->Model->execute(); + break; + case 'V': + $this->View->execute(); + break; + case 'C': + $this->Controller->execute(); + break; + case 'P': + $this->Project->execute(); + break; + case 'F': + $this->Fixture->execute(); + break; + case 'T': + $this->Test->execute(); + break; + case 'Q': + exit(0); + break; + default: + $this->out(__('You have made an invalid selection. Please choose a type of class to Bake by entering D, M, V, F, T, or C.', true)); + } + $this->hr(); + $this->main(); + } + +/** + * Quickly bake the MVC + * + * @access public + */ + function all() { + $this->hr(); + $this->out('Bake All'); + $this->hr(); + + if (!isset($this->params['connection']) && empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + + if (empty($this->args)) { + $this->Model->interactive = true; + $name = $this->Model->getName($this->connection); + } + + foreach (array('Model', 'Controller', 'View') as $task) { + $this->{$task}->connection = $this->connection; + $this->{$task}->interactive = false; + } + + if (!empty($this->args[0])) { + $name = $this->args[0]; + } + + $modelExists = false; + $model = $this->_modelName($name); + if (App::import('Model', $model)) { + $object = new $model(); + $modelExists = true; + } else { + App::import('Model', 'Model', false); + $object = new Model(array('name' => $name, 'ds' => $this->connection)); + } + + $modelBaked = $this->Model->bake($object, false); + + if ($modelBaked && $modelExists === false) { + $this->out(sprintf(__('%s Model was baked.', true), $model)); + if ($this->_checkUnitTest()) { + $this->Model->bakeFixture($model); + $this->Model->bakeTest($model); + } + $modelExists = true; + } + + if ($modelExists === true) { + $controller = $this->_controllerName($name); + if ($this->Controller->bake($controller, $this->Controller->bakeActions($controller))) { + $this->out(sprintf(__('%s Controller was baked.', true), $name)); + if ($this->_checkUnitTest()) { + $this->Controller->bakeTest($controller); + } + } + if (App::import('Controller', $controller)) { + $this->View->args = array($controller); + $this->View->execute(); + $this->out(sprintf(__('%s Views were baked.', true), $name)); + } + $this->out(__('Bake All complete', true)); + array_shift($this->args); + } else { + $this->err(__('Bake All could not continue without a valid model', true)); + } + $this->_stop(); + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->out('CakePHP Bake:'); + $this->hr(); + $this->out('The Bake script generates controllers, views and models for your application.'); + $this->out('If run with no command line arguments, Bake guides the user through the class'); + $this->out('creation process. You can customize the generation process by telling Bake'); + $this->out('where different parts of your application are using command line arguments.'); + $this->hr(); + $this->out("Usage: cake bake ..."); + $this->hr(); + $this->out('Params:'); + $this->out("\t-app Absolute/Relative path to your app folder.\n"); + $this->out('Commands:'); + $this->out("\n\tbake help\n\t\tshows this help message."); + $this->out("\n\tbake all \n\t\tbakes complete MVC. optional of a Model"); + $this->out("\n\tbake project \n\t\tbakes a new app folder in the path supplied\n\t\tor in current directory if no path is specified"); + $this->out("\n\tbake plugin \n\t\tbakes a new plugin folder in the path supplied\n\t\tor in current directory if no path is specified."); + $this->out("\n\tbake db_config\n\t\tbakes a database.php file in config directory."); + $this->out("\n\tbake model\n\t\tbakes a model. run 'bake model help' for more info"); + $this->out("\n\tbake view\n\t\tbakes views. run 'bake view help' for more info"); + $this->out("\n\tbake controller\n\t\tbakes a controller. run 'bake controller help' for more info"); + $this->out("\n\tbake fixture\n\t\tbakes fixtures. run 'bake fixture help' for more info."); + $this->out("\n\tbake test\n\t\tbakes unit tests. run 'bake test help' for more info."); + $this->out(); + + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/console.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/console.php new file mode 100644 index 000000000..ac7b595bb --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/console.php @@ -0,0 +1,361 @@ +Dispatcher = new Dispatcher(); + $this->models = App::objects('model'); + App::import('Model', $this->models); + + foreach ($this->models as $model) { + $class = Inflector::camelize(str_replace('.php', '', $model)); + $this->models[$model] = $class; + $this->{$class} =& new $class(); + } + $this->out('Model classes:'); + $this->out('--------------'); + + foreach ($this->models as $model) { + $this->out(" - {$model}"); + } + $this->_loadRoutes(); + } + +/** + * Prints the help message + * + * @access public + */ + function help() { + $out = 'Console help:'; + $out .= '-------------'; + $out .= 'The interactive console is a tool for testing parts of your app before you'; + $out .= 'write code.'; + $out .= "\n"; + $out .= 'Model testing:'; + $out .= 'To test model results, use the name of your model without a leading $'; + $out .= 'e.g. Foo->find("all")'; + $out .= "\n"; + $out .= 'To dynamically set associations, you can do the following:'; + $out .= "\tModelA bind ModelB"; + $out .= "where the supported assocations are hasOne, hasMany, belongsTo, hasAndBelongsToMany"; + $out .= "\n"; + $out .= 'To dynamically remove associations, you can do the following:'; + $out .= "\t ModelA unbind ModelB"; + $out .= "where the supported associations are the same as above"; + $out .= "\n"; + $out .= "To save a new field in a model, you can do the following:"; + $out .= "\tModelA->save(array('foo' => 'bar', 'baz' => 0))"; + $out .= "where you are passing a hash of data to be saved in the format"; + $out .= "of field => value pairs"; + $out .= "\n"; + $out .= "To get column information for a model, use the following:"; + $out .= "\tModelA columns"; + $out .= "which returns a list of columns and their type"; + $out .= "\n"; + $out .= "\n"; + $out .= 'Route testing:'; + $out .= "\n"; + $out .= 'To test URLs against your app\'s route configuration, type:'; + $out .= "\n"; + $out .= "\tRoute "; + $out .= "\n"; + $out .= "where url is the path to your your action plus any query parameters,"; + $out .= "minus the application's base path. For example:"; + $out .= "\n"; + $out .= "\tRoute /posts/view/1"; + $out .= "\n"; + $out .= "will return something like the following:"; + $out .= "\n"; + $out .= "\tarray ("; + $out .= "\t [...]"; + $out .= "\t 'controller' => 'posts',"; + $out .= "\t 'action' => 'view',"; + $out .= "\t [...]"; + $out .= "\t)"; + $out .= "\n"; + $out .= 'Alternatively, you can use simple array syntax to test reverse'; + $out .= 'To reload your routes config (config/routes.php), do the following:'; + $out .= "\n"; + $out .= "\tRoutes reload"; + $out .= "\n"; + $out .= 'To show all connected routes, do the following:'; + $out .= "\tRoutes show"; + $this->out($out); + } + +/** + * Override main() to handle action + * + * @access public + */ + function main($command = null) { + while (true) { + if (empty($command)) { + $command = trim($this->in('')); + } + + switch ($command) { + case 'help': + $this->help(); + break; + case 'quit': + case 'exit': + return true; + break; + case 'models': + $this->out('Model classes:'); + $this->hr(); + foreach ($this->models as $model) { + $this->out(" - {$model}"); + } + break; + case (preg_match("/^(\w+) bind (\w+) (\w+)/", $command, $tmp) == true): + foreach ($tmp as $data) { + $data = strip_tags($data); + $data = str_replace($this->badCommandChars, "", $data); + } + + $modelA = $tmp[1]; + $association = $tmp[2]; + $modelB = $tmp[3]; + + if ($this->_isValidModel($modelA) && $this->_isValidModel($modelB) && in_array($association, $this->associations)) { + $this->{$modelA}->bindModel(array($association => array($modelB => array('className' => $modelB))), false); + $this->out("Created $association association between $modelA and $modelB"); + } else { + $this->out("Please verify you are using valid models and association types"); + } + break; + case (preg_match("/^(\w+) unbind (\w+) (\w+)/", $command, $tmp) == true): + foreach ($tmp as $data) { + $data = strip_tags($data); + $data = str_replace($this->badCommandChars, "", $data); + } + + $modelA = $tmp[1]; + $association = $tmp[2]; + $modelB = $tmp[3]; + + // Verify that there is actually an association to unbind + $currentAssociations = $this->{$modelA}->getAssociated(); + $validCurrentAssociation = false; + + foreach ($currentAssociations as $model => $currentAssociation) { + if ($model == $modelB && $association == $currentAssociation) { + $validCurrentAssociation = true; + } + } + + if ($this->_isValidModel($modelA) && $this->_isValidModel($modelB) && in_array($association, $this->associations) && $validCurrentAssociation) { + $this->{$modelA}->unbindModel(array($association => array($modelB))); + $this->out("Removed $association association between $modelA and $modelB"); + } else { + $this->out("Please verify you are using valid models, valid current association, and valid association types"); + } + break; + case (strpos($command, "->find") > 0): + // Remove any bad info + $command = strip_tags($command); + $command = str_replace($this->badCommandChars, "", $command); + + // Do we have a valid model? + list($modelToCheck, $tmp) = explode('->', $command); + + if ($this->_isValidModel($modelToCheck)) { + $findCommand = "\$data = \$this->$command;"; + @eval($findCommand); + + if (is_array($data)) { + foreach ($data as $idx => $results) { + if (is_numeric($idx)) { // findAll() output + foreach ($results as $modelName => $result) { + $this->out("$modelName"); + + foreach ($result as $field => $value) { + if (is_array($value)) { + foreach ($value as $field2 => $value2) { + $this->out("\t$field2: $value2"); + } + + $this->out(); + } else { + $this->out("\t$field: $value"); + } + } + } + } else { // find() output + $this->out($idx); + + foreach ($results as $field => $value) { + if (is_array($value)) { + foreach ($value as $field2 => $value2) { + $this->out("\t$field2: $value2"); + } + + $this->out(); + } else { + $this->out("\t$field: $value"); + } + } + } + } + } else { + $this->out("\nNo result set found"); + } + } else { + $this->out("$modelToCheck is not a valid model"); + } + + break; + case (strpos($command, '->save') > 0): + // Validate the model we're trying to save here + $command = strip_tags($command); + $command = str_replace($this->badCommandChars, "", $command); + list($modelToSave, $tmp) = explode("->", $command); + + if ($this->_isValidModel($modelToSave)) { + // Extract the array of data we are trying to build + list($foo, $data) = explode("->save", $command); + $data = preg_replace('/^\(*(array)?\(*(.+?)\)*$/i', '\\2', $data); + $saveCommand = "\$this->{$modelToSave}->save(array('{$modelToSave}' => array({$data})));"; + @eval($saveCommand); + $this->out('Saved record for ' . $modelToSave); + } + break; + case (preg_match("/^(\w+) columns/", $command, $tmp) == true): + $modelToCheck = strip_tags(str_replace($this->badCommandChars, "", $tmp[1])); + + if ($this->_isValidModel($modelToCheck)) { + // Get the column info for this model + $fieldsCommand = "\$data = \$this->{$modelToCheck}->getColumnTypes();"; + @eval($fieldsCommand); + + if (is_array($data)) { + foreach ($data as $field => $type) { + $this->out("\t{$field}: {$type}"); + } + } + } else { + $this->out("Please verify that you selected a valid model"); + } + break; + case (preg_match("/^routes\s+reload/i", $command, $tmp) == true): + $router =& Router::getInstance(); + if (!$this->_loadRoutes()) { + $this->out("There was an error loading the routes config. Please check that the file"); + $this->out("exists and is free of parse errors."); + break; + } + $this->out("Routes configuration reloaded, " . count($router->routes) . " routes connected"); + break; + case (preg_match("/^routes\s+show/i", $command, $tmp) == true): + $router =& Router::getInstance(); + $this->out(implode("\n", Set::extract($router->routes, '{n}.0'))); + break; + case (preg_match("/^route\s+(\(.*\))$/i", $command, $tmp) == true): + if ($url = eval('return array' . $tmp[1] . ';')) { + $this->out(Router::url($url)); + } + break; + case (preg_match("/^route\s+(.*)/i", $command, $tmp) == true): + $this->out(var_export(Router::parse($tmp[1]), true)); + break; + default: + $this->out("Invalid command\n"); + break; + } + $command = ''; + } + } + +/** + * Tells if the specified model is included in the list of available models + * + * @param string $modelToCheck + * @return boolean true if is an available model, false otherwise + * @access protected + */ + function _isValidModel($modelToCheck) { + return in_array($modelToCheck, $this->models); + } + +/** + * Reloads the routes configuration from config/routes.php, and compiles + * all routes found + * + * @return boolean True if config reload was a success, otherwise false + * @access protected + */ + function _loadRoutes() { + $router =& Router::getInstance(); + + $router->reload(); + extract($router->getNamedExpressions()); + + if (!@include(CONFIGS . 'routes.php')) { + return false; + } + $router->parse('/'); + + foreach (array_keys($router->getNamedExpressions()) as $var) { + unset(${$var}); + } + for ($i = 0, $len = count($router->routes); $i < $len; $i++) { + $router->routes[$i]->compile(); + } + return true; + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/i18n.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/i18n.php new file mode 100644 index 000000000..bdfa378fb --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/i18n.php @@ -0,0 +1,128 @@ +_welcome(); + if (isset($this->params['datasource'])) { + $this->dataSource = $this->params['datasource']; + } + + if ($this->command && !in_array($this->command, array('help'))) { + if (!config('database')) { + $this->out(__('Your database configuration was not found. Take a moment to create one.', true), true); + return $this->DbConfig->execute(); + } + } + } + +/** + * Override main() for help message hook + * + * @access public + */ + function main() { + $this->out(__('I18n Shell', true)); + $this->hr(); + $this->out(__('[E]xtract POT file from sources', true)); + $this->out(__('[I]nitialize i18n database table', true)); + $this->out(__('[H]elp', true)); + $this->out(__('[Q]uit', true)); + + $choice = strtolower($this->in(__('What would you like to do?', true), array('E', 'I', 'H', 'Q'))); + switch ($choice) { + case 'e': + $this->Extract->execute(); + break; + case 'i': + $this->initdb(); + break; + case 'h': + $this->help(); + break; + case 'q': + exit(0); + break; + default: + $this->out(__('You have made an invalid selection. Please choose a command to execute by entering E, I, H, or Q.', true)); + } + $this->hr(); + $this->main(); + } + +/** + * Initialize I18N database. + * + * @access public + */ + function initdb() { + $this->Dispatch->args = array('schema', 'create', 'i18n'); + $this->Dispatch->dispatch(); + } + +/** + * Show help screen. + * + * @access public + */ + function help() { + $this->hr(); + $this->out(__('I18n Shell:', true)); + $this->hr(); + $this->out(__('I18n Shell initializes i18n database table for your application', true)); + $this->out(__('and generates .pot file(s) with translations.', true)); + $this->hr(); + $this->out(__('usage:', true)); + $this->out(' cake i18n help'); + $this->out(' cake i18n initdb [-datasource custom]'); + $this->out(); + $this->hr(); + + $this->Extract->help(); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/schema.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/schema.php new file mode 100644 index 000000000..8a0c9547d --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/schema.php @@ -0,0 +1,512 @@ +_welcome(); + $this->out('Cake Schema Shell'); + $this->hr(); + } + +/** + * Override startup + * + * @access public + */ + function startup() { + $name = $file = $path = $connection = $plugin = null; + if (!empty($this->params['name'])) { + $name = $this->params['name']; + } elseif (!empty($this->args[0])) { + $name = $this->params['name'] = $this->args[0]; + } + + if (strpos($name, '.')) { + list($this->params['plugin'], $splitName) = pluginSplit($name); + $name = $this->params['name'] = $splitName; + } + + if ($name) { + $this->params['file'] = Inflector::underscore($name); + } + + if (empty($this->params['file'])) { + $this->params['file'] = 'schema.php'; + } + if (strpos($this->params['file'], '.php') === false) { + $this->params['file'] .= '.php'; + } + $file = $this->params['file']; + + if (!empty($this->params['path'])) { + $path = $this->params['path']; + } + + if (!empty($this->params['connection'])) { + $connection = $this->params['connection']; + } + if (!empty($this->params['plugin'])) { + $plugin = $this->params['plugin']; + if (empty($name)) { + $name = $plugin; + } + } + $this->Schema =& new CakeSchema(compact('name', 'path', 'file', 'connection', 'plugin')); + } + +/** + * Override main + * + * @access public + */ + function main() { + $this->help(); + } + +/** + * Read and output contents of schema object + * path to read as second arg + * + * @access public + */ + function view() { + $File = new File($this->Schema->path . DS . $this->params['file']); + if ($File->exists()) { + $this->out($File->read()); + $this->_stop(); + } else { + $file = $this->Schema->path . DS . $this->params['file']; + $this->err(sprintf(__('Schema file (%s) could not be found.', true), $file)); + $this->_stop(); + } + } + +/** + * Read database and Write schema object + * accepts a connection as first arg or path to save as second arg + * + * @access public + */ + function generate() { + $this->out(__('Generating Schema...', true)); + $options = array(); + if (isset($this->params['f'])) { + $options = array('models' => false); + } + + $snapshot = false; + if (isset($this->args[0]) && $this->args[0] === 'snapshot') { + $snapshot = true; + } + + if (!$snapshot && file_exists($this->Schema->path . DS . $this->params['file'])) { + $snapshot = true; + $result = strtolower($this->in("Schema file exists.\n [O]verwrite\n [S]napshot\n [Q]uit\nWould you like to do?", array('o', 's', 'q'), 's')); + if ($result === 'q') { + return $this->_stop(); + } + if ($result === 'o') { + $snapshot = false; + } + } + + $cacheDisable = Configure::read('Cache.disable'); + Configure::write('Cache.disable', true); + + $content = $this->Schema->read($options); + $content['file'] = $this->params['file']; + + Configure::write('Cache.disable', $cacheDisable); + + if ($snapshot === true) { + $Folder =& new Folder($this->Schema->path); + $result = $Folder->read(); + + $numToUse = false; + if (isset($this->params['s'])) { + $numToUse = $this->params['s']; + } + + $count = 1; + if (!empty($result[1])) { + foreach ($result[1] as $file) { + if (preg_match('/schema(?:[_\d]*)?\.php$/', $file)) { + $count++; + } + } + } + + if ($numToUse !== false) { + if ($numToUse > $count) { + $count = $numToUse; + } + } + + $fileName = rtrim($this->params['file'], '.php'); + $content['file'] = $fileName . '_' . $count . '.php'; + } + + if ($this->Schema->write($content)) { + $this->out(sprintf(__('Schema file: %s generated', true), $content['file'])); + $this->_stop(); + } else { + $this->err(__('Schema file: %s generated', true)); + $this->_stop(); + } + } + +/** + * Dump Schema object to sql file + * Use the `write` param to enable and control SQL file output location. + * Simply using -write will write the sql file to the same dir as the schema file. + * If -write contains a full path name the file will be saved there. If -write only + * contains no DS, that will be used as the file name, in the same dir as the schema file. + * + * @access public + */ + function dump() { + $write = false; + $Schema = $this->Schema->load(); + if (!$Schema) { + $this->err(__('Schema could not be loaded', true)); + $this->_stop(); + } + if (isset($this->params['write'])) { + if ($this->params['write'] == 1) { + $write = Inflector::underscore($this->Schema->name); + } else { + $write = $this->params['write']; + } + } + $db =& ConnectionManager::getDataSource($this->Schema->connection); + $contents = "#" . $Schema->name . " sql generated on: " . date('Y-m-d H:i:s') . " : " . time() . "\n\n"; + $contents .= $db->dropSchema($Schema) . "\n\n". $db->createSchema($Schema); + + if ($write) { + if (strpos($write, '.sql') === false) { + $write .= '.sql'; + } + if (strpos($write, DS) !== false) { + $File =& new File($write, true); + } else { + $File =& new File($this->Schema->path . DS . $write, true); + } + + if ($File->write($contents)) { + $this->out(sprintf(__('SQL dump file created in %s', true), $File->pwd())); + $this->_stop(); + } else { + $this->err(__('SQL dump could not be created', true)); + $this->_stop(); + } + } + $this->out($contents); + return $contents; + } + +/** + * Run database create commands. Alias for run create. + * + * @return void + */ + function create() { + list($Schema, $table) = $this->_loadSchema(); + $this->__create($Schema, $table); + } + +/** + * Run database create commands. Alias for run create. + * + * @return void + */ + function update() { + list($Schema, $table) = $this->_loadSchema(); + $this->__update($Schema, $table); + } + +/** + * Prepares the Schema objects for database operations. + * + * @return void + */ + function _loadSchema() { + $name = $plugin = null; + if (isset($this->params['name'])) { + $name = $this->params['name']; + } + if (isset($this->params['plugin'])) { + $plugin = $this->params['plugin']; + } + + if (isset($this->params['dry'])) { + $this->__dry = true; + $this->out(__('Performing a dry run.', true)); + } + + $options = array('name' => $name, 'plugin' => $plugin); + if (isset($this->params['s'])) { + $fileName = rtrim($this->Schema->file, '.php'); + $options['file'] = $fileName . '_' . $this->params['s'] . '.php'; + } + + $Schema =& $this->Schema->load($options); + + if (!$Schema) { + $this->err(sprintf(__('%s could not be loaded', true), $this->Schema->path . DS . $this->Schema->file)); + $this->_stop(); + } + $table = null; + if (isset($this->args[1])) { + $table = $this->args[1]; + } + return array(&$Schema, $table); + } + +/** + * Create database from Schema object + * Should be called via the run method + * + * @access private + */ + function __create(&$Schema, $table = null) { + $db =& ConnectionManager::getDataSource($this->Schema->connection); + + $drop = $create = array(); + + if (!$table) { + foreach ($Schema->tables as $table => $fields) { + $drop[$table] = $db->dropSchema($Schema, $table); + $create[$table] = $db->createSchema($Schema, $table); + } + } elseif (isset($Schema->tables[$table])) { + $drop[$table] = $db->dropSchema($Schema, $table); + $create[$table] = $db->createSchema($Schema, $table); + } + if (empty($drop) || empty($create)) { + $this->out(__('Schema is up to date.', true)); + $this->_stop(); + } + + $this->out("\n" . __('The following table(s) will be dropped.', true)); + $this->out(array_keys($drop)); + + if ('y' == $this->in(__('Are you sure you want to drop the table(s)?', true), array('y', 'n'), 'n')) { + $this->out(__('Dropping table(s).', true)); + $this->__run($drop, 'drop', $Schema); + } + + $this->out("\n" . __('The following table(s) will be created.', true)); + $this->out(array_keys($create)); + + if ('y' == $this->in(__('Are you sure you want to create the table(s)?', true), array('y', 'n'), 'y')) { + $this->out(__('Creating table(s).', true)); + $this->__run($create, 'create', $Schema); + } + $this->out(__('End create.', true)); + } + +/** + * Update database with Schema object + * Should be called via the run method + * + * @access private + */ + function __update(&$Schema, $table = null) { + $db =& ConnectionManager::getDataSource($this->Schema->connection); + + $this->out(__('Comparing Database to Schema...', true)); + $options = array(); + if (isset($this->params['f'])) { + $options['models'] = false; + } + $Old = $this->Schema->read($options); + $compare = $this->Schema->compare($Old, $Schema); + + $contents = array(); + + if (empty($table)) { + foreach ($compare as $table => $changes) { + $contents[$table] = $db->alterSchema(array($table => $changes), $table); + } + } elseif (isset($compare[$table])) { + $contents[$table] = $db->alterSchema(array($table => $compare[$table]), $table); + } + + if (empty($contents)) { + $this->out(__('Schema is up to date.', true)); + $this->_stop(); + } + + $this->out("\n" . __('The following statements will run.', true)); + $this->out(array_map('trim', $contents)); + if ('y' == $this->in(__('Are you sure you want to alter the tables?', true), array('y', 'n'), 'n')) { + $this->out(); + $this->out(__('Updating Database...', true)); + $this->__run($contents, 'update', $Schema); + } + + $this->out(__('End update.', true)); + } + +/** + * Runs sql from __create() or __update() + * + * @access private + */ + function __run($contents, $event, &$Schema) { + if (empty($contents)) { + $this->err(__('Sql could not be run', true)); + return; + } + Configure::write('debug', 2); + $db =& ConnectionManager::getDataSource($this->Schema->connection); + + foreach ($contents as $table => $sql) { + if (empty($sql)) { + $this->out(sprintf(__('%s is up to date.', true), $table)); + } else { + if ($this->__dry === true) { + $this->out(sprintf(__('Dry run for %s :', true), $table)); + $this->out($sql); + } else { + if (!$Schema->before(array($event => $table))) { + return false; + } + $error = null; + if (!$db->execute($sql)) { + $error = $table . ': ' . $db->lastError(); + } + + $Schema->after(array($event => $table, 'errors' => $error)); + + if (!empty($error)) { + $this->out($error); + } else { + $this->out(sprintf(__('%s updated.', true), $table)); + } + } + } + } + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $help = << ... +--------------------------------------------------------------- +Params: + -connection + set db config . uses 'default' if none is specified + + -path + path to read and write schema.php. + default path: {$this->Schema->path} + + -name + Classname to use. If is Plugin.className, it will + set the plugin and name params. + + -file + file to read and write. + default file: {$this->Schema->file} + + -s + snapshot to use for run. + + -dry + Perform a dry run on create + update commands. + Queries will be output to window instead of executed. + + -f + force 'generate' to create a new schema. + + -plugin + Indicate the plugin to use. + +Commands: + + schema help + shows this help message. + + schema view + read and output contents of schema file. + + schema generate + reads from 'connection' writes to 'path' + To force generation of all tables into the schema, use the -f param. + Use 'schema generate snapshot ' to generate snapshots + which you can use with the -s parameter in the other operations. + + schema dump + Dump database sql based on schema file to stdout. + If you use the `-write` param is used a .sql will be generated. + If `-write` is a filename, then that file name will be generate. + If `-write` is a full path, the schema will be written there. + + schema create + Drop and create tables based on schema file + optional
    argument can be used to create only a single + table in the schema. Pass the -s param with a number to use a snapshot. + Use the `-dry` param to preview the changes. + + schema update
    + Alter the tables based on schema file. Optional
    + parameter will only update one table. + To use a snapshot pass the `-s` param with the snapshot number. + To preview the changes that will be done use `-dry`. + To force update of all tables into the schema, use the -f param. +TEXT; + $this->out($help); + $this->_stop(); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/shell.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/shell.php new file mode 100644 index 000000000..529f1c527 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/shell.php @@ -0,0 +1,647 @@ + 'command'); + + foreach ($vars as $key => $var) { + if (is_string($key)) { + $this->{$var} =& $dispatch->{$key}; + } else { + $this->{$var} =& $dispatch->{$var}; + } + } + + if ($this->name == null) { + $this->name = get_class($this); + } + + if ($this->alias == null) { + $this->alias = $this->name; + } + + ClassRegistry::addObject($this->name, $this); + ClassRegistry::map($this->name, $this->alias); + + if (!PHP5 && isset($this->args[0])) { + if (strpos($this->name, strtolower(Inflector::camelize($this->args[0]))) !== false) { + $dispatch->shiftArgs(); + } + if (strtolower($this->command) == strtolower(Inflector::variable($this->args[0])) && method_exists($this, $this->command)) { + $dispatch->shiftArgs(); + } + } + + $this->Dispatch =& $dispatch; + } + +/** + * Initializes the Shell + * acts as constructor for subclasses + * allows configuration of tasks prior to shell execution + * + * @access public + */ + function initialize() { + $this->_loadModels(); + } + +/** + * Starts up the Shell + * allows for checking and configuring prior to command or main execution + * can be overriden in subclasses + * + * @access public + */ + function startup() { + $this->_welcome(); + } + +/** + * Displays a header for the shell + * + * @access protected + */ + function _welcome() { + $this->Dispatch->clear(); + $this->out(); + $this->out('Welcome to CakePHP v' . Configure::version() . ' Console'); + $this->hr(); + $this->out('App : '. $this->params['app']); + $this->out('Path: '. $this->params['working']); + $this->hr(); + } + +/** + * Loads database file and constructs DATABASE_CONFIG class + * makes $this->DbConfig available to subclasses + * + * @return bool + * @access protected + */ + function _loadDbConfig() { + if (config('database') && class_exists('DATABASE_CONFIG')) { + $this->DbConfig =& new DATABASE_CONFIG(); + return true; + } + $this->err('Database config could not be loaded.'); + $this->out('Run `bake` to create the database configuration.'); + return false; + } + +/** + * if var $uses = true + * Loads AppModel file and constructs AppModel class + * makes $this->AppModel available to subclasses + * if var $uses is an array of models will load those models + * + * @return bool + * @access protected + */ + function _loadModels() { + if ($this->uses === null || $this->uses === false) { + return; + } + + if ($this->uses === true && App::import('Model', 'AppModel')) { + $this->AppModel =& new AppModel(false, false, false); + return true; + } + + if ($this->uses !== true && !empty($this->uses)) { + $uses = is_array($this->uses) ? $this->uses : array($this->uses); + + $modelClassName = $uses[0]; + if (strpos($uses[0], '.') !== false) { + list($plugin, $modelClassName) = explode('.', $uses[0]); + } + $this->modelClass = $modelClassName; + + foreach ($uses as $modelClass) { + list($plugin, $modelClass) = pluginSplit($modelClass, true); + if (PHP5) { + $this->{$modelClass} = ClassRegistry::init($plugin . $modelClass); + } else { + $this->{$modelClass} =& ClassRegistry::init($plugin . $modelClass); + } + } + return true; + } + return false; + } + +/** + * Loads tasks defined in var $tasks + * + * @return bool + * @access public + */ + function loadTasks() { + if ($this->tasks === null || $this->tasks === false || $this->tasks === true || empty($this->tasks)) { + return true; + } + + $tasks = $this->tasks; + if (!is_array($tasks)) { + $tasks = array($tasks); + } + + foreach ($tasks as $taskName) { + $task = Inflector::underscore($taskName); + $taskClass = Inflector::camelize($taskName . 'Task'); + + if (!class_exists($taskClass)) { + foreach ($this->Dispatch->shellPaths as $path) { + $taskPath = $path . 'tasks' . DS . $task . '.php'; + if (file_exists($taskPath)) { + require_once $taskPath; + break; + } + } + } + $taskClassCheck = $taskClass; + if (!PHP5) { + $taskClassCheck = strtolower($taskClass); + } + if (ClassRegistry::isKeySet($taskClassCheck)) { + $this->taskNames[] = $taskName; + if (!PHP5) { + $this->{$taskName} =& ClassRegistry::getObject($taskClassCheck); + } else { + $this->{$taskName} = ClassRegistry::getObject($taskClassCheck); + } + } else { + $this->taskNames[] = $taskName; + if (!PHP5) { + $this->{$taskName} =& new $taskClass($this->Dispatch); + } else { + $this->{$taskName} = new $taskClass($this->Dispatch); + } + } + + if (!isset($this->{$taskName})) { + $this->err("Task `{$taskName}` could not be loaded"); + $this->_stop(); + } + } + + return true; + } + +/** + * Prompts the user for input, and returns it. + * + * @param string $prompt Prompt text. + * @param mixed $options Array or string of options. + * @param string $default Default input value. + * @return Either the default value, or the user-provided input. + * @access public + */ + function in($prompt, $options = null, $default = null) { + if (!$this->interactive) { + return $default; + } + $in = $this->Dispatch->getInput($prompt, $options, $default); + + if ($options && is_string($options)) { + if (strpos($options, ',')) { + $options = explode(',', $options); + } elseif (strpos($options, '/')) { + $options = explode('/', $options); + } else { + $options = array($options); + } + } + if (is_array($options)) { + while ($in == '' || ($in && (!in_array(strtolower($in), $options) && !in_array(strtoupper($in), $options)) && !in_array($in, $options))) { + $in = $this->Dispatch->getInput($prompt, $options, $default); + } + } + if ($in) { + return $in; + } + } + +/** + * Outputs a single or multiple messages to stdout. If no parameters + * are passed outputs just a newline. + * + * @param mixed $message A string or a an array of strings to output + * @param integer $newlines Number of newlines to append + * @return integer Returns the number of bytes returned from writing to stdout. + * @access public + */ + function out($message = null, $newlines = 1) { + if (is_array($message)) { + $message = implode($this->nl(), $message); + } + return $this->Dispatch->stdout($message . $this->nl($newlines), false); + } + +/** + * Outputs a single or multiple error messages to stderr. If no parameters + * are passed outputs just a newline. + * + * @param mixed $message A string or a an array of strings to output + * @param integer $newlines Number of newlines to append + * @access public + */ + function err($message = null, $newlines = 1) { + if (is_array($message)) { + $message = implode($this->nl(), $message); + } + $this->Dispatch->stderr($message . $this->nl($newlines)); + } + +/** + * Returns a single or multiple linefeeds sequences. + * + * @param integer $multiplier Number of times the linefeed sequence should be repeated + * @access public + * @return string + */ + function nl($multiplier = 1) { + return str_repeat("\n", $multiplier); + } + +/** + * Outputs a series of minus characters to the standard output, acts as a visual separator. + * + * @param integer $newlines Number of newlines to pre- and append + * @access public + */ + function hr($newlines = 0) { + $this->out(null, $newlines); + $this->out('---------------------------------------------------------------'); + $this->out(null, $newlines); + } + +/** + * Displays a formatted error message + * and exits the application with status code 1 + * + * @param string $title Title of the error + * @param string $message An optional error message + * @access public + */ + function error($title, $message = null) { + $this->err(sprintf(__('Error: %s', true), $title)); + + if (!empty($message)) { + $this->err($message); + } + $this->_stop(1); + } + +/** + * Will check the number args matches otherwise throw an error + * + * @param integer $expectedNum Expected number of paramters + * @param string $command Command + * @access protected + */ + function _checkArgs($expectedNum, $command = null) { + if (!$command) { + $command = $this->command; + } + if (count($this->args) < $expectedNum) { + $message[] = "Got: " . count($this->args); + $message[] = "Expected: {$expectedNum}"; + $message[] = "Please type `cake {$this->shell} help` for help"; + $message[] = "on usage of the {$this->name} {$command}."; + $this->error('Wrong number of parameters', $message); + } + } + +/** + * Creates a file at given path + * + * @param string $path Where to put the file. + * @param string $contents Content to put in the file. + * @return boolean Success + * @access public + */ + function createFile($path, $contents) { + $path = str_replace(DS . DS, DS, $path); + + $this->out(); + $this->out(sprintf(__("Creating file %s", true), $path)); + + if (is_file($path) && $this->interactive === true) { + $prompt = sprintf(__('File `%s` exists, overwrite?', true), $path); + $key = $this->in($prompt, array('y', 'n', 'q'), 'n'); + + if (strtolower($key) == 'q') { + $this->out(__('Quitting.', true), 2); + $this->_stop(); + } elseif (strtolower($key) != 'y') { + $this->out(sprintf(__('Skip `%s`', true), $path), 2); + return false; + } + } + if (!class_exists('File')) { + require LIBS . 'file.php'; + } + + if ($File = new File($path, true)) { + $data = $File->prepare($contents); + $File->write($data); + $this->out(sprintf(__('Wrote `%s`', true), $path)); + return true; + } else { + $this->err(sprintf(__('Could not write to `%s`.', true), $path), 2); + return false; + } + } + +/** + * Outputs usage text on the standard output. Implement it in subclasses. + * + * @access public + */ + function help() { + if ($this->command != null) { + $this->err("Unknown {$this->name} command `{$this->command}`."); + $this->err("For usage, try `cake {$this->shell} help`.", 2); + } else { + $this->Dispatch->help(); + } + } + +/** + * Action to create a Unit Test + * + * @return boolean Success + * @access protected + */ + function _checkUnitTest() { + if (App::import('vendor', 'simpletest' . DS . 'simpletest')) { + return true; + } + $prompt = 'SimpleTest is not installed. Do you want to bake unit test files anyway?'; + $unitTest = $this->in($prompt, array('y','n'), 'y'); + $result = strtolower($unitTest) == 'y' || strtolower($unitTest) == 'yes'; + + if ($result) { + $this->out(); + $this->out('You can download SimpleTest from http://simpletest.org'); + } + return $result; + } + +/** + * Makes absolute file path easier to read + * + * @param string $file Absolute file path + * @return sting short path + * @access public + */ + function shortPath($file) { + $shortPath = str_replace(ROOT, null, $file); + $shortPath = str_replace('..' . DS, '', $shortPath); + return str_replace(DS . DS, DS, $shortPath); + } + +/** + * Creates the proper controller path for the specified controller class name + * + * @param string $name Controller class name + * @return string Path to controller + * @access protected + */ + function _controllerPath($name) { + return strtolower(Inflector::underscore($name)); + } + +/** + * Creates the proper controller plural name for the specified controller class name + * + * @param string $name Controller class name + * @return string Controller plural name + * @access protected + */ + function _controllerName($name) { + return Inflector::pluralize(Inflector::camelize($name)); + } + +/** + * Creates the proper controller camelized name (singularized) for the specified name + * + * @param string $name Name + * @return string Camelized and singularized controller name + * @access protected + */ + function _modelName($name) { + return Inflector::camelize(Inflector::singularize($name)); + } + +/** + * Creates the proper underscored model key for associations + * + * @param string $name Model class name + * @return string Singular model key + * @access protected + */ + function _modelKey($name) { + return Inflector::underscore($name) . '_id'; + } + +/** + * Creates the proper model name from a foreign key + * + * @param string $key Foreign key + * @return string Model name + * @access protected + */ + function _modelNameFromKey($key) { + return Inflector::camelize(str_replace('_id', '', $key)); + } + +/** + * creates the singular name for use in views. + * + * @param string $name + * @return string $name + * @access protected + */ + function _singularName($name) { + return Inflector::variable(Inflector::singularize($name)); + } + +/** + * Creates the plural name for views + * + * @param string $name Name to use + * @return string Plural name for views + * @access protected + */ + function _pluralName($name) { + return Inflector::variable(Inflector::pluralize($name)); + } + +/** + * Creates the singular human name used in views + * + * @param string $name Controller name + * @return string Singular human name + * @access protected + */ + function _singularHumanName($name) { + return Inflector::humanize(Inflector::underscore(Inflector::singularize($name))); + } + +/** + * Creates the plural human name used in views + * + * @param string $name Controller name + * @return string Plural human name + * @access protected + */ + function _pluralHumanName($name) { + return Inflector::humanize(Inflector::underscore($name)); + } + +/** + * Find the correct path for a plugin. Scans $pluginPaths for the plugin you want. + * + * @param string $pluginName Name of the plugin you want ie. DebugKit + * @return string $path path to the correct plugin. + */ + function _pluginPath($pluginName) { + return App::pluginPath($pluginName); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/bake.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/bake.php new file mode 100644 index 000000000..8394bb531 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/bake.php @@ -0,0 +1,60 @@ +path; + if (isset($this->plugin)) { + $name = substr($this->name, 0, strlen($this->name) - 4); + $path = $this->_pluginPath($this->plugin) . Inflector::pluralize(Inflector::underscore($name)) . DS; + } + return $path; + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/controller.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/controller.php new file mode 100644 index 000000000..8ef10042b --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/controller.php @@ -0,0 +1,486 @@ +args)) { + return $this->__interactive(); + } + + if (isset($this->args[0])) { + if (!isset($this->connection)) { + $this->connection = 'default'; + } + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + + $controller = $this->_controllerName($this->args[0]); + $actions = 'scaffold'; + + if (!empty($this->args[1]) && ($this->args[1] == 'public' || $this->args[1] == 'scaffold')) { + $this->out(__('Baking basic crud methods for ', true) . $controller); + $actions = $this->bakeActions($controller); + } elseif (!empty($this->args[1]) && $this->args[1] == 'admin') { + $admin = $this->Project->getPrefix(); + if ($admin) { + $this->out(sprintf(__('Adding %s methods', true), $admin)); + $actions = $this->bakeActions($controller, $admin); + } + } + + if (!empty($this->args[2]) && $this->args[2] == 'admin') { + $admin = $this->Project->getPrefix(); + if ($admin) { + $this->out(sprintf(__('Adding %s methods', true), $admin)); + $actions .= "\n" . $this->bakeActions($controller, $admin); + } + } + + if ($this->bake($controller, $actions)) { + if ($this->_checkUnitTest()) { + $this->bakeTest($controller); + } + } + } + } + +/** + * Bake All the controllers at once. Will only bake controllers for models that exist. + * + * @access public + * @return void + */ + function all() { + $this->interactive = false; + $this->listAll($this->connection, false); + ClassRegistry::config('Model', array('ds' => $this->connection)); + $unitTestExists = $this->_checkUnitTest(); + foreach ($this->__tables as $table) { + $model = $this->_modelName($table); + $controller = $this->_controllerName($model); + if (App::import('Model', $model)) { + $actions = $this->bakeActions($controller); + if ($this->bake($controller, $actions) && $unitTestExists) { + $this->bakeTest($controller); + } + } + } + } + +/** + * Interactive + * + * @access private + */ + function __interactive() { + $this->interactive = true; + $this->hr(); + $this->out(sprintf(__("Bake Controller\nPath: %s", true), $this->path)); + $this->hr(); + + if (empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + + $controllerName = $this->getName(); + $this->hr(); + $this->out(sprintf(__('Baking %sController', true), $controllerName)); + $this->hr(); + + $helpers = $components = array(); + $actions = ''; + $wannaUseSession = 'y'; + $wannaBakeAdminCrud = 'n'; + $useDynamicScaffold = 'n'; + $wannaBakeCrud = 'y'; + + $controllerFile = strtolower(Inflector::underscore($controllerName)); + + $question[] = __("Would you like to build your controller interactively?", true); + if (file_exists($this->path . $controllerFile .'_controller.php')) { + $question[] = sprintf(__("Warning: Choosing no will overwrite the %sController.", true), $controllerName); + } + $doItInteractive = $this->in(implode("\n", $question), array('y','n'), 'y'); + + if (strtolower($doItInteractive) == 'y') { + $this->interactive = true; + $useDynamicScaffold = $this->in( + __("Would you like to use dynamic scaffolding?", true), array('y','n'), 'n' + ); + + if (strtolower($useDynamicScaffold) == 'y') { + $wannaBakeCrud = 'n'; + $actions = 'scaffold'; + } else { + list($wannaBakeCrud, $wannaBakeAdminCrud) = $this->_askAboutMethods(); + + $helpers = $this->doHelpers(); + $components = $this->doComponents(); + + $wannaUseSession = $this->in( + __("Would you like to use Session flash messages?", true), array('y','n'), 'y' + ); + } + } else { + list($wannaBakeCrud, $wannaBakeAdminCrud) = $this->_askAboutMethods(); + } + + if (strtolower($wannaBakeCrud) == 'y') { + $actions = $this->bakeActions($controllerName, null, strtolower($wannaUseSession) == 'y'); + } + if (strtolower($wannaBakeAdminCrud) == 'y') { + $admin = $this->Project->getPrefix(); + $actions .= $this->bakeActions($controllerName, $admin, strtolower($wannaUseSession) == 'y'); + } + + $baked = false; + if ($this->interactive === true) { + $this->confirmController($controllerName, $useDynamicScaffold, $helpers, $components); + $looksGood = $this->in(__('Look okay?', true), array('y','n'), 'y'); + + if (strtolower($looksGood) == 'y') { + $baked = $this->bake($controllerName, $actions, $helpers, $components); + if ($baked && $this->_checkUnitTest()) { + $this->bakeTest($controllerName); + } + } + } else { + $baked = $this->bake($controllerName, $actions, $helpers, $components); + if ($baked && $this->_checkUnitTest()) { + $this->bakeTest($controllerName); + } + } + return $baked; + } + +/** + * Confirm a to be baked controller with the user + * + * @return void + */ + function confirmController($controllerName, $useDynamicScaffold, $helpers, $components) { + $this->out(); + $this->hr(); + $this->out(__('The following controller will be created:', true)); + $this->hr(); + $this->out(sprintf(__("Controller Name:\n\t%s", true), $controllerName)); + + if (strtolower($useDynamicScaffold) == 'y') { + $this->out("var \$scaffold;"); + } + + $properties = array( + 'helpers' => __("Helpers:", true), + 'components' => __('Components:', true), + ); + + foreach ($properties as $var => $title) { + if (count($$var)) { + $output = ''; + $length = count($$var); + foreach ($$var as $i => $propElement) { + if ($i != $length -1) { + $output .= ucfirst($propElement) . ', '; + } else { + $output .= ucfirst($propElement); + } + } + $this->out($title . "\n\t" . $output); + } + } + $this->hr(); + } + +/** + * Interact with the user and ask about which methods (admin or regular they want to bake) + * + * @return array Array containing (bakeRegular, bakeAdmin) answers + */ + function _askAboutMethods() { + $wannaBakeCrud = $this->in( + __("Would you like to create some basic class methods \n(index(), add(), view(), edit())?", true), + array('y','n'), 'n' + ); + $wannaBakeAdminCrud = $this->in( + __("Would you like to create the basic class methods for admin routing?", true), + array('y','n'), 'n' + ); + return array($wannaBakeCrud, $wannaBakeAdminCrud); + } + +/** + * Bake scaffold actions + * + * @param string $controllerName Controller name + * @param string $admin Admin route to use + * @param boolean $wannaUseSession Set to true to use sessions, false otherwise + * @return string Baked actions + * @access private + */ + function bakeActions($controllerName, $admin = null, $wannaUseSession = true) { + $currentModelName = $modelImport = $this->_modelName($controllerName); + $plugin = $this->plugin; + if ($plugin) { + $modelImport = $plugin . '.' . $modelImport; + } + if (!App::import('Model', $modelImport)) { + $this->err(__('You must have a model for this class to build basic methods. Please try again.', true)); + $this->_stop(); + } + + $modelObj =& ClassRegistry::init($currentModelName); + $controllerPath = $this->_controllerPath($controllerName); + $pluralName = $this->_pluralName($currentModelName); + $singularName = Inflector::variable($currentModelName); + $singularHumanName = $this->_singularHumanName($controllerName); + $pluralHumanName = $this->_pluralName($controllerName); + + $this->Template->set(compact('plugin', 'admin', 'controllerPath', 'pluralName', 'singularName', 'singularHumanName', + 'pluralHumanName', 'modelObj', 'wannaUseSession', 'currentModelName')); + $actions = $this->Template->generate('actions', 'controller_actions'); + return $actions; + } + +/** + * Assembles and writes a Controller file + * + * @param string $controllerName Controller name + * @param string $actions Actions to add, or set the whole controller to use $scaffold (set $actions to 'scaffold') + * @param array $helpers Helpers to use in controller + * @param array $components Components to use in controller + * @param array $uses Models to use in controller + * @return string Baked controller + * @access private + */ + function bake($controllerName, $actions = '', $helpers = null, $components = null) { + $isScaffold = ($actions === 'scaffold') ? true : false; + + $this->Template->set('plugin', Inflector::camelize($this->plugin)); + $this->Template->set(compact('controllerName', 'actions', 'helpers', 'components', 'isScaffold')); + $contents = $this->Template->generate('classes', 'controller'); + + $path = $this->getPath(); + $filename = $path . $this->_controllerPath($controllerName) . '_controller.php'; + if ($this->createFile($filename, $contents)) { + return $contents; + } + return false; + } + +/** + * Assembles and writes a unit test file + * + * @param string $className Controller class name + * @return string Baked test + * @access private + */ + function bakeTest($className) { + $this->Test->plugin = $this->plugin; + $this->Test->connection = $this->connection; + $this->Test->interactive = $this->interactive; + return $this->Test->bake('Controller', $className); + } + +/** + * Interact with the user and get a list of additional helpers + * + * @return array Helpers that the user wants to use. + */ + function doHelpers() { + return $this->_doPropertyChoices( + __("Would you like this controller to use other helpers\nbesides HtmlHelper and FormHelper?", true), + __("Please provide a comma separated list of the other\nhelper names you'd like to use.\nExample: 'Ajax, Javascript, Time'", true) + ); + } + +/** + * Interact with the user and get a list of additional components + * + * @return array Components the user wants to use. + */ + function doComponents() { + return $this->_doPropertyChoices( + __("Would you like this controller to use any components?", true), + __("Please provide a comma separated list of the component names you'd like to use.\nExample: 'Acl, Security, RequestHandler'", true) + ); + } + +/** + * Common code for property choice handling. + * + * @param string $prompt A yes/no question to precede the list + * @param sting $example A question for a comma separated list, with examples. + * @return array Array of values for property. + */ + function _doPropertyChoices($prompt, $example) { + $proceed = $this->in($prompt, array('y','n'), 'n'); + $property = array(); + if (strtolower($proceed) == 'y') { + $propertyList = $this->in($example); + $propertyListTrimmed = str_replace(' ', '', $propertyList); + $property = explode(',', $propertyListTrimmed); + } + return array_filter($property); + } + +/** + * Outputs and gets the list of possible controllers from database + * + * @param string $useDbConfig Database configuration name + * @param boolean $interactive Whether you are using listAll interactively and want options output. + * @return array Set of controllers + * @access public + */ + function listAll($useDbConfig = null) { + if (is_null($useDbConfig)) { + $useDbConfig = $this->connection; + } + $this->__tables = $this->Model->getAllTables($useDbConfig); + + if ($this->interactive == true) { + $this->out(__('Possible Controllers based on your current database:', true)); + $this->_controllerNames = array(); + $count = count($this->__tables); + for ($i = 0; $i < $count; $i++) { + $this->_controllerNames[] = $this->_controllerName($this->_modelName($this->__tables[$i])); + $this->out($i + 1 . ". " . $this->_controllerNames[$i]); + } + return $this->_controllerNames; + } + return $this->__tables; + } + +/** + * Forces the user to specify the controller he wants to bake, and returns the selected controller name. + * + * @param string $useDbConfig Connection name to get a controller name for. + * @return string Controller name + * @access public + */ + function getName($useDbConfig = null) { + $controllers = $this->listAll($useDbConfig); + $enteredController = ''; + + while ($enteredController == '') { + $enteredController = $this->in(__("Enter a number from the list above,\ntype in the name of another controller, or 'q' to exit", true), null, 'q'); + + if ($enteredController === 'q') { + $this->out(__("Exit", true)); + $this->_stop(); + } + + if ($enteredController == '' || intval($enteredController) > count($controllers)) { + $this->err(__("The Controller name you supplied was empty,\nor the number you selected was not an option. Please try again.", true)); + $enteredController = ''; + } + } + + if (intval($enteredController) > 0 && intval($enteredController) <= count($controllers) ) { + $controllerName = $controllers[intval($enteredController) - 1]; + } else { + $controllerName = Inflector::camelize($enteredController); + } + return $controllerName; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake controller ..."); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the controller to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out('Params:'); + $this->out(); + $this->out('-connection '); + $this->out("\tset db config . uses 'default' if none is specified"); + $this->out(); + $this->out('Commands:'); + $this->out(); + $this->out("controller "); + $this->out("\tbakes controller with var \$scaffold"); + $this->out(); + $this->out("controller public"); + $this->out("\tbakes controller with basic crud actions"); + $this->out("\t(index, view, add, edit, delete)"); + $this->out(); + $this->out("controller admin"); + $this->out("\tbakes a controller with basic crud actions for one of the"); + $this->out("\tConfigure::read('Routing.prefixes') methods."); + $this->out(); + $this->out("controller public admin"); + $this->out("\tbakes a controller with basic crud actions for one"); + $this->out("\tConfigure::read('Routing.prefixes') and non admin methods."); + $this->out("\t(index, view, add, edit, delete,"); + $this->out("\tadmin_index, admin_view, admin_edit, admin_add, admin_delete)"); + $this->out(); + $this->out("controller all"); + $this->out("\tbakes all controllers with CRUD methods."); + $this->out(); + $this->_stop(); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/db_config.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/db_config.php new file mode 100644 index 000000000..df86d19f2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/db_config.php @@ -0,0 +1,368 @@ + 'default', 'driver'=> 'mysql', 'persistent'=> 'false', 'host'=> 'localhost', + 'login'=> 'root', 'password'=> 'password', 'database'=> 'project_name', + 'schema'=> null, 'prefix'=> null, 'encoding' => null, 'port' => null + ); + +/** + * String name of the database config class name. + * Used for testing. + * + * @var string + */ + var $databaseClassName = 'DATABASE_CONFIG'; + +/** + * initialization callback + * + * @var string + * @access public + */ + function initialize() { + $this->path = $this->params['working'] . DS . 'config' . DS; + } + +/** + * Execution method always used for tasks + * + * @access public + */ + function execute() { + if (empty($this->args)) { + $this->__interactive(); + $this->_stop(); + } + } + +/** + * Interactive interface + * + * @access private + */ + function __interactive() { + $this->hr(); + $this->out('Database Configuration:'); + $this->hr(); + $done = false; + $dbConfigs = array(); + + while ($done == false) { + $name = ''; + + while ($name == '') { + $name = $this->in("Name:", null, 'default'); + if (preg_match('/[^a-z0-9_]/i', $name)) { + $name = ''; + $this->out('The name may only contain unaccented latin characters, numbers or underscores'); + } else if (preg_match('/^[^a-z_]/i', $name)) { + $name = ''; + $this->out('The name must start with an unaccented latin character or an underscore'); + } + } + + $driver = $this->in('Driver:', array('db2', 'firebird', 'mssql', 'mysql', 'mysqli', 'odbc', 'oracle', 'postgres', 'sqlite', 'sybase'), 'mysql'); + + $persistent = $this->in('Persistent Connection?', array('y', 'n'), 'n'); + if (strtolower($persistent) == 'n') { + $persistent = 'false'; + } else { + $persistent = 'true'; + } + + $host = ''; + while ($host == '') { + $host = $this->in('Database Host:', null, 'localhost'); + } + + $port = ''; + while ($port == '') { + $port = $this->in('Port?', null, 'n'); + } + + if (strtolower($port) == 'n') { + $port = null; + } + + $login = ''; + while ($login == '') { + $login = $this->in('User:', null, 'root'); + } + $password = ''; + $blankPassword = false; + + while ($password == '' && $blankPassword == false) { + $password = $this->in('Password:'); + + if ($password == '') { + $blank = $this->in('The password you supplied was empty. Use an empty password?', array('y', 'n'), 'n'); + if ($blank == 'y') { + $blankPassword = true; + } + } + } + + $database = ''; + while ($database == '') { + $database = $this->in('Database Name:', null, 'cake'); + } + + $prefix = ''; + while ($prefix == '') { + $prefix = $this->in('Table Prefix?', null, 'n'); + } + if (strtolower($prefix) == 'n') { + $prefix = null; + } + + $encoding = ''; + while ($encoding == '') { + $encoding = $this->in('Table encoding?', null, 'n'); + } + if (strtolower($encoding) == 'n') { + $encoding = null; + } + + $schema = ''; + if ($driver == 'postgres') { + while ($schema == '') { + $schema = $this->in('Table schema?', null, 'n'); + } + } + if (strtolower($schema) == 'n') { + $schema = null; + } + + $config = compact('name', 'driver', 'persistent', 'host', 'login', 'password', 'database', 'prefix', 'encoding', 'port', 'schema'); + + while ($this->__verify($config) == false) { + $this->__interactive(); + } + $dbConfigs[] = $config; + $doneYet = $this->in('Do you wish to add another database configuration?', null, 'n'); + + if (strtolower($doneYet == 'n')) { + $done = true; + } + } + + $this->bake($dbConfigs); + config('database'); + return true; + } + +/** + * Output verification message and bake if it looks good + * + * @return boolean True if user says it looks good, false otherwise + * @access private + */ + function __verify($config) { + $config = array_merge($this->__defaultConfig, $config); + extract($config); + $this->out(); + $this->hr(); + $this->out('The following database configuration will be created:'); + $this->hr(); + $this->out("Name: $name"); + $this->out("Driver: $driver"); + $this->out("Persistent: $persistent"); + $this->out("Host: $host"); + + if ($port) { + $this->out("Port: $port"); + } + + $this->out("User: $login"); + $this->out("Pass: " . str_repeat('*', strlen($password))); + $this->out("Database: $database"); + + if ($prefix) { + $this->out("Table prefix: $prefix"); + } + + if ($schema) { + $this->out("Schema: $schema"); + } + + if ($encoding) { + $this->out("Encoding: $encoding"); + } + + $this->hr(); + $looksGood = $this->in('Look okay?', array('y', 'n'), 'y'); + + if (strtolower($looksGood) == 'y') { + return $config; + } + return false; + } + +/** + * Assembles and writes database.php + * + * @param array $configs Configuration settings to use + * @return boolean Success + * @access public + */ + function bake($configs) { + if (!is_dir($this->path)) { + $this->err($this->path . ' not found'); + return false; + } + + $filename = $this->path . 'database.php'; + $oldConfigs = array(); + + if (file_exists($filename)) { + config('database'); + $db = new $this->databaseClassName; + $temp = get_class_vars(get_class($db)); + + foreach ($temp as $configName => $info) { + $info = array_merge($this->__defaultConfig, $info); + + if (!isset($info['schema'])) { + $info['schema'] = null; + } + if (!isset($info['encoding'])) { + $info['encoding'] = null; + } + if (!isset($info['port'])) { + $info['port'] = null; + } + + if ($info['persistent'] === false) { + $info['persistent'] = 'false'; + } else { + $info['persistent'] = ($info['persistent'] == true) ? 'true' : 'false'; + } + + $oldConfigs[] = array( + 'name' => $configName, + 'driver' => $info['driver'], + 'persistent' => $info['persistent'], + 'host' => $info['host'], + 'port' => $info['port'], + 'login' => $info['login'], + 'password' => $info['password'], + 'database' => $info['database'], + 'prefix' => $info['prefix'], + 'schema' => $info['schema'], + 'encoding' => $info['encoding'] + ); + } + } + + foreach ($oldConfigs as $key => $oldConfig) { + foreach ($configs as $key1 => $config) { + if ($oldConfig['name'] == $config['name']) { + unset($oldConfigs[$key]); + } + } + } + + $configs = array_merge($oldConfigs, $configs); + $out = "__defaultConfig, $config); + extract($config); + + $out .= "\tvar \${$name} = array(\n"; + $out .= "\t\t'driver' => '{$driver}',\n"; + $out .= "\t\t'persistent' => {$persistent},\n"; + $out .= "\t\t'host' => '{$host}',\n"; + + if ($port) { + $out .= "\t\t'port' => {$port},\n"; + } + + $out .= "\t\t'login' => '{$login}',\n"; + $out .= "\t\t'password' => '{$password}',\n"; + $out .= "\t\t'database' => '{$database}',\n"; + + if ($schema) { + $out .= "\t\t'schema' => '{$schema}',\n"; + } + + if ($prefix) { + $out .= "\t\t'prefix' => '{$prefix}',\n"; + } + + if ($encoding) { + $out .= "\t\t'encoding' => '{$encoding}'\n"; + } + + $out .= "\t);\n"; + } + + $out .= "}\n"; + $out .= "?>"; + $filename = $this->path . 'database.php'; + return $this->createFile($filename, $out); + } + +/** + * Get a user specified Connection name + * + * @return void + */ + function getConfig() { + App::import('Model', 'ConnectionManager', false); + + $useDbConfig = 'default'; + $configs = get_class_vars($this->databaseClassName); + if (!is_array($configs)) { + return $this->execute(); + } + + $connections = array_keys($configs); + if (count($connections) > 1) { + $useDbConfig = $this->in(__('Use Database Config', true) .':', $connections, 'default'); + } + return $useDbConfig; + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/extract.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/extract.php new file mode 100644 index 000000000..5dc928b04 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/extract.php @@ -0,0 +1,494 @@ +params['files']) && !is_array($this->params['files'])) { + $this->__files = explode(',', $this->params['files']); + } + if (isset($this->params['paths'])) { + $this->__paths = explode(',', $this->params['paths']); + } else { + $defaultPath = $this->params['working']; + $message = sprintf(__("What is the full path you would like to extract?\nExample: %s\n[Q]uit [D]one", true), $this->params['root'] . DS . 'myapp'); + while (true) { + $response = $this->in($message, null, $defaultPath); + if (strtoupper($response) === 'Q') { + $this->out(__('Extract Aborted', true)); + $this->_stop(); + } elseif (strtoupper($response) === 'D') { + $this->out(); + break; + } elseif (is_dir($response)) { + $this->__paths[] = $response; + $defaultPath = 'D'; + } else { + $this->err(__('The directory path you supplied was not found. Please try again.', true)); + } + $this->out(); + } + } + + if (isset($this->params['output'])) { + $this->__output = $this->params['output']; + } else { + $message = sprintf(__("What is the full path you would like to output?\nExample: %s\n[Q]uit", true), $this->__paths[0] . DS . 'locale'); + while (true) { + $response = $this->in($message, null, $this->__paths[0] . DS . 'locale'); + if (strtoupper($response) === 'Q') { + $this->out(__('Extract Aborted', true)); + $this->_stop(); + } elseif (is_dir($response)) { + $this->__output = $response . DS; + break; + } else { + $this->err(__('The directory path you supplied was not found. Please try again.', true)); + } + $this->out(); + } + } + + if (isset($this->params['merge'])) { + $this->__merge = !(strtolower($this->params['merge']) === 'no'); + } else { + $this->out(); + $response = $this->in(sprintf(__('Would you like to merge all domains strings into the default.pot file?', true)), array('y', 'n'), 'n'); + $this->__merge = strtolower($response) === 'y'; + } + + if (empty($this->__files)) { + $this->__searchFiles(); + } + $this->__extract(); + } + +/** + * Extract text + * + * @return void + * @access private + */ + function __extract() { + $this->out(); + $this->out(); + $this->out(__('Extracting...', true)); + $this->hr(); + $this->out(__('Paths:', true)); + foreach ($this->__paths as $path) { + $this->out(' ' . $path); + } + $this->out(__('Output Directory: ', true) . $this->__output); + $this->hr(); + $this->__extractTokens(); + $this->__buildFiles(); + $this->__writeFiles(); + $this->__paths = $this->__files = $this->__storage = array(); + $this->__strings = $this->__tokens = array(); + $this->out(); + $this->out(__('Done.', true)); + } + +/** + * Show help options + * + * @return void + * @access public + */ + function help() { + $this->out(__('CakePHP Language String Extraction:', true)); + $this->hr(); + $this->out(__('The Extract script generates .pot file(s) with translations', true)); + $this->out(__('By default the .pot file(s) will be place in the locale directory of -app', true)); + $this->out(__('By default -app is ROOT/app', true)); + $this->hr(); + $this->out(__('Usage: cake i18n extract ...', true)); + $this->out(); + $this->out(__('Params:', true)); + $this->out(__(' -app [path...]: directory where your application is located', true)); + $this->out(__(' -root [path...]: path to install', true)); + $this->out(__(' -core [path...]: path to cake directory', true)); + $this->out(__(' -paths [comma separated list of paths, full path is needed]', true)); + $this->out(__(' -merge [yes|no]: Merge all domains strings into the default.pot file', true)); + $this->out(__(' -output [path...]: Full path to output directory', true)); + $this->out(__(' -files: [comma separated list of files, full path to file is needed]', true)); + $this->out(); + $this->out(__('Commands:', true)); + $this->out(__(' cake i18n extract help: Shows this help message.', true)); + $this->out(); + } + +/** + * Extract tokens out of all files to be processed + * + * @return void + * @access private + */ + function __extractTokens() { + foreach ($this->__files as $file) { + $this->__file = $file; + $this->out(sprintf(__('Processing %s...', true), $file)); + + $code = file_get_contents($file); + $allTokens = token_get_all($code); + $this->__tokens = array(); + $lineNumber = 1; + + foreach ($allTokens as $token) { + if ((!is_array($token)) || (($token[0] != T_WHITESPACE) && ($token[0] != T_INLINE_HTML))) { + if (is_array($token)) { + $token[] = $lineNumber; + } + $this->__tokens[] = $token; + } + + if (is_array($token)) { + $lineNumber += count(explode("\n", $token[1])) - 1; + } else { + $lineNumber += count(explode("\n", $token)) - 1; + } + } + unset($allTokens); + $this->__parse('__', array('singular')); + $this->__parse('__n', array('singular', 'plural')); + $this->__parse('__d', array('domain', 'singular')); + $this->__parse('__c', array('singular')); + $this->__parse('__dc', array('domain', 'singular')); + $this->__parse('__dn', array('domain', 'singular', 'plural')); + $this->__parse('__dcn', array('domain', 'singular', 'plural')); + } + } + +/** + * Parse tokens + * + * @param string $functionName Function name that indicates translatable string (e.g: '__') + * @param array $map Array containing what variables it will find (e.g: domain, singular, plural) + * @return void + * @access private + */ + function __parse($functionName, $map) { + $count = 0; + $tokenCount = count($this->__tokens); + + while (($tokenCount - $count) > 1) { + list($countToken, $firstParenthesis) = array($this->__tokens[$count], $this->__tokens[$count + 1]); + if (!is_array($countToken)) { + $count++; + continue; + } + + list($type, $string, $line) = $countToken; + if (($type == T_STRING) && ($string == $functionName) && ($firstParenthesis == '(')) { + $position = $count; + $depth = 0; + + while ($depth == 0) { + if ($this->__tokens[$position] == '(') { + $depth++; + } elseif ($this->__tokens[$position] == ')') { + $depth--; + } + $position++; + } + + $mapCount = count($map); + $strings = array(); + while (count($strings) < $mapCount && ($this->__tokens[$position] == ',' || $this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING)) { + if ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING) { + $strings[] = $this->__tokens[$position][1]; + } + $position++; + } + + if ($mapCount == count($strings)) { + extract(array_combine($map, $strings)); + if (!isset($domain)) { + $domain = '\'default\''; + } + $string = $this->__formatString($singular); + if (isset($plural)) { + $string .= "\0" . $this->__formatString($plural); + } + $this->__strings[$this->__formatString($domain)][$string][$this->__file][] = $line; + } else { + $this->__markerError($this->__file, $line, $functionName, $count); + } + } + $count++; + } + } + +/** + * Build the translate template file contents out of obtained strings + * + * @return void + * @access private + */ + function __buildFiles() { + foreach ($this->__strings as $domain => $strings) { + foreach ($strings as $string => $files) { + $occurrences = array(); + foreach ($files as $file => $lines) { + $occurrences[] = $file . ':' . implode(';', $lines); + } + $occurrences = implode("\n#: ", $occurrences); + $header = '#: ' . str_replace($this->__paths, '', $occurrences) . "\n"; + + if (strpos($string, "\0") === false) { + $sentence = "msgid \"{$string}\"\n"; + $sentence .= "msgstr \"\"\n\n"; + } else { + list($singular, $plural) = explode("\0", $string); + $sentence = "msgid \"{$singular}\"\n"; + $sentence .= "msgid_plural \"{$plural}\"\n"; + $sentence .= "msgstr[0] \"\"\n"; + $sentence .= "msgstr[1] \"\"\n\n"; + } + + $this->__store($domain, $header, $sentence); + if ($domain != 'default' && $this->__merge) { + $this->__store('default', $header, $sentence); + } + } + } + } + +/** + * Prepare a file to be stored + * + * @return void + * @access private + */ + function __store($domain, $header, $sentence) { + if (!isset($this->__storage[$domain])) { + $this->__storage[$domain] = array(); + } + if (!isset($this->__storage[$domain][$sentence])) { + $this->__storage[$domain][$sentence] = $header; + } else { + $this->__storage[$domain][$sentence] .= $header; + } + } + +/** + * Write the files that need to be stored + * + * @return void + * @access private + */ + function __writeFiles() { + $overwriteAll = false; + foreach ($this->__storage as $domain => $sentences) { + $output = $this->__writeHeader(); + foreach ($sentences as $sentence => $header) { + $output .= $header . $sentence; + } + + $filename = $domain . '.pot'; + $File = new File($this->__output . $filename); + $response = ''; + while ($overwriteAll === false && $File->exists() && strtoupper($response) !== 'Y') { + $this->out(); + $response = $this->in(sprintf(__('Error: %s already exists in this location. Overwrite? [Y]es, [N]o, [A]ll', true), $filename), array('y', 'n', 'a'), 'y'); + if (strtoupper($response) === 'N') { + $response = ''; + while ($response == '') { + $response = $this->in(sprintf(__("What would you like to name this file?\nExample: %s", true), 'new_' . $filename), null, 'new_' . $filename); + $File = new File($this->__output . $response); + $filename = $response; + } + } elseif (strtoupper($response) === 'A') { + $overwriteAll = true; + } + } + $File->write($output); + $File->close(); + } + } + +/** + * Build the translation template header + * + * @return string Translation template header + * @access private + */ + function __writeHeader() { + $output = "# LANGUAGE translation of CakePHP Application\n"; + $output .= "# Copyright YEAR NAME \n"; + $output .= "#\n"; + $output .= "#, fuzzy\n"; + $output .= "msgid \"\"\n"; + $output .= "msgstr \"\"\n"; + $output .= "\"Project-Id-Version: PROJECT VERSION\\n\"\n"; + $output .= "\"POT-Creation-Date: " . date("Y-m-d H:iO") . "\\n\"\n"; + $output .= "\"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\\n\"\n"; + $output .= "\"Last-Translator: NAME \\n\"\n"; + $output .= "\"Language-Team: LANGUAGE \\n\"\n"; + $output .= "\"MIME-Version: 1.0\\n\"\n"; + $output .= "\"Content-Type: text/plain; charset=utf-8\\n\"\n"; + $output .= "\"Content-Transfer-Encoding: 8bit\\n\"\n"; + $output .= "\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n\"\n\n"; + return $output; + } + +/** + * Format a string to be added as a translateable string + * + * @param string $string String to format + * @return string Formatted string + * @access private + */ + function __formatString($string) { + $quote = substr($string, 0, 1); + $string = substr($string, 1, -1); + if ($quote == '"') { + $string = stripcslashes($string); + } else { + $string = strtr($string, array("\\'" => "'", "\\\\" => "\\")); + } + $string = str_replace("\r\n", "\n", $string); + return addcslashes($string, "\0..\37\\\""); + } + +/** + * Indicate an invalid marker on a processed file + * + * @param string $file File where invalid marker resides + * @param integer $line Line number + * @param string $marker Marker found + * @param integer $count Count + * @return void + * @access private + */ + function __markerError($file, $line, $marker, $count) { + $this->out(sprintf(__("Invalid marker content in %s:%s\n* %s(", true), $file, $line, $marker), true); + $count += 2; + $tokenCount = count($this->__tokens); + $parenthesis = 1; + + while ((($tokenCount - $count) > 0) && $parenthesis) { + if (is_array($this->__tokens[$count])) { + $this->out($this->__tokens[$count][1], false); + } else { + $this->out($this->__tokens[$count], false); + if ($this->__tokens[$count] == '(') { + $parenthesis++; + } + + if ($this->__tokens[$count] == ')') { + $parenthesis--; + } + } + $count++; + } + $this->out("\n", true); + } + +/** + * Search files that may contain translateable strings + * + * @return void + * @access private + */ + function __searchFiles() { + foreach ($this->__paths as $path) { + $Folder = new Folder($path); + $files = $Folder->findRecursive('.*\.(php|ctp|thtml|inc|tpl)', true); + $this->__files = array_merge($this->__files, $files); + } + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/fixture.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/fixture.php new file mode 100644 index 000000000..124d61f78 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/fixture.php @@ -0,0 +1,425 @@ +path = $this->params['working'] . DS . 'tests' . DS . 'fixtures' . DS; + } + +/** + * Execution method always used for tasks + * Handles dispatching to interactive, named, or all processess. + * + * @access public + */ + function execute() { + if (empty($this->args)) { + $this->__interactive(); + } + + if (isset($this->args[0])) { + $this->interactive = false; + if (!isset($this->connection)) { + $this->connection = 'default'; + } + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + $model = $this->_modelName($this->args[0]); + $this->bake($model); + } + } + +/** + * Bake All the Fixtures at once. Will only bake fixtures for models that exist. + * + * @access public + * @return void + */ + function all() { + $this->interactive = false; + $this->Model->interactive = false; + $tables = $this->Model->listAll($this->connection, false); + foreach ($tables as $table) { + $model = $this->_modelName($table); + $this->bake($model); + } + } + +/** + * Interactive baking function + * + * @access private + */ + function __interactive() { + $this->DbConfig->interactive = $this->Model->interactive = $this->interactive = true; + $this->hr(); + $this->out(sprintf("Bake Fixture\nPath: %s", $this->path)); + $this->hr(); + + $useDbConfig = $this->connection; + if (!isset($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + $modelName = $this->Model->getName($this->connection); + $useTable = $this->Model->getTable($modelName, $this->connection); + $importOptions = $this->importOptions($modelName); + $this->bake($modelName, $useTable, $importOptions); + } + +/** + * Interacts with the User to setup an array of import options. For a fixture. + * + * @param string $modelName Name of model you are dealing with. + * @return array Array of import options. + * @access public + */ + function importOptions($modelName) { + $options = array(); + $doSchema = $this->in(__('Would you like to import schema for this fixture?', true), array('y', 'n'), 'n'); + if ($doSchema == 'y') { + $options['schema'] = $modelName; + } + $doRecords = $this->in(__('Would you like to use record importing for this fixture?', true), array('y', 'n'), 'n'); + if ($doRecords == 'y') { + $options['records'] = true; + } + if ($doRecords == 'n') { + $prompt = sprintf(__("Would you like to build this fixture with data from %s's table?", true), $modelName); + $fromTable = $this->in($prompt, array('y', 'n'), 'n'); + if (strtolower($fromTable) == 'y') { + $options['fromTable'] = true; + } + } + return $options; + } + +/** + * Assembles and writes a Fixture file + * + * @param string $model Name of model to bake. + * @param string $useTable Name of table to use. + * @param array $importOptions Options for var $import + * @return string Baked fixture content + * @access public + */ + function bake($model, $useTable = false, $importOptions = array()) { + if (!class_exists('CakeSchema')) { + App::import('Model', 'CakeSchema', false); + } + $table = $schema = $records = $import = $modelImport = null; + $importBits = array(); + + if (!$useTable) { + $useTable = Inflector::tableize($model); + } elseif ($useTable != Inflector::tableize($model)) { + $table = $useTable; + } + + if (!empty($importOptions)) { + if (isset($importOptions['schema'])) { + $modelImport = true; + $importBits[] = "'model' => '{$importOptions['schema']}'"; + } + if (isset($importOptions['records'])) { + $importBits[] = "'records' => true"; + } + if ($this->connection != 'default') { + $importBits[] .= "'connection' => '{$this->connection}'"; + } + if (!empty($importBits)) { + $import = sprintf("array(%s)", implode(', ', $importBits)); + } + } + + $this->_Schema = new CakeSchema(); + $data = $this->_Schema->read(array('models' => false, 'connection' => $this->connection)); + + if (!isset($data['tables'][$useTable])) { + $this->err('Could not find your selected table ' . $useTable); + return false; + } + + $tableInfo = $data['tables'][$useTable]; + if (is_null($modelImport)) { + $schema = $this->_generateSchema($tableInfo); + } + + if (!isset($importOptions['records']) && !isset($importOptions['fromTable'])) { + $recordCount = 1; + if (isset($this->params['count'])) { + $recordCount = $this->params['count']; + } + $records = $this->_makeRecordString($this->_generateRecords($tableInfo, $recordCount)); + } + if (isset($this->params['records']) || isset($importOptions['fromTable'])) { + $records = $this->_makeRecordString($this->_getRecordsFromTable($model, $useTable)); + } + $out = $this->generateFixtureFile($model, compact('records', 'table', 'schema', 'import', 'fields')); + return $out; + } + +/** + * Generate the fixture file, and write to disk + * + * @param string $model name of the model being generated + * @param string $fixture Contents of the fixture file. + * @return string Content saved into fixture file. + * @access public + */ + function generateFixtureFile($model, $otherVars) { + $defaults = array('table' => null, 'schema' => null, 'records' => null, 'import' => null, 'fields' => null); + $vars = array_merge($defaults, $otherVars); + + $path = $this->getPath(); + $filename = Inflector::underscore($model) . '_fixture.php'; + + $this->Template->set('model', $model); + $this->Template->set($vars); + $content = $this->Template->generate('classes', 'fixture'); + + $this->out("\nBaking test fixture for $model..."); + $this->createFile($path . $filename, $content); + return $content; + } + +/** + * Get the path to the fixtures. + * + * @return void + */ + function getPath() { + $path = $this->path; + if (isset($this->plugin)) { + $path = $this->_pluginPath($this->plugin) . 'tests' . DS . 'fixtures' . DS; + } + return $path; + } + +/** + * Generates a string representation of a schema. + * + * @param array $table Table schema array + * @return string fields definitions + * @access protected + */ + function _generateSchema($tableInfo) { + $schema = $this->_Schema->generateTable('f', $tableInfo); + return substr($schema, 10, -2); + } + +/** + * Generate String representation of Records + * + * @param array $table Table schema array + * @return array Array of records to use in the fixture. + * @access protected + */ + function _generateRecords($tableInfo, $recordCount = 1) { + $records = array(); + for ($i = 0; $i < $recordCount; $i++) { + $record = array(); + foreach ($tableInfo as $field => $fieldInfo) { + if (empty($fieldInfo['type'])) { + continue; + } + switch ($fieldInfo['type']) { + case 'integer': + case 'float': + $insert = $i + 1; + break; + case 'string': + case 'binary': + $isPrimaryUuid = ( + isset($fieldInfo['key']) && strtolower($fieldInfo['key']) == 'primary' && + isset($fieldInfo['length']) && $fieldInfo['length'] == 36 + ); + if ($isPrimaryUuid) { + $insert = String::uuid(); + } else { + $insert = "Lorem ipsum dolor sit amet"; + if (!empty($fieldInfo['length'])) { + $insert = substr($insert, 0, (int)$fieldInfo['length'] - 2); + } + } + $insert = "'$insert'"; + break; + case 'timestamp': + $ts = time(); + $insert = "'$ts'"; + break; + case 'datetime': + $ts = date('Y-m-d H:i:s'); + $insert = "'$ts'"; + break; + case 'date': + $ts = date('Y-m-d'); + $insert = "'$ts'"; + break; + case 'time': + $ts = date('H:i:s'); + $insert = "'$ts'"; + break; + case 'boolean': + $insert = 1; + break; + case 'text': + $insert = "'Lorem ipsum dolor sit amet, aliquet feugiat."; + $insert .= " Convallis morbi fringilla gravida,"; + $insert .= " phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin"; + $insert .= " venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla"; + $insert .= " vestibulum massa neque ut et, id hendrerit sit,"; + $insert .= " feugiat in taciti enim proin nibh, tempor dignissim, rhoncus"; + $insert .= " duis vestibulum nunc mattis convallis.'"; + break; + } + $record[$field] = $insert; + } + $records[] = $record; + } + return $records; + } + +/** + * Convert a $records array into a a string. + * + * @param array $records Array of records to be converted to string + * @return string A string value of the $records array. + * @access protected + */ + function _makeRecordString($records) { + $out = "array(\n"; + foreach ($records as $record) { + $values = array(); + foreach ($record as $field => $value) { + $values[] = "\t\t\t'$field' => $value"; + } + $out .= "\t\tarray(\n"; + $out .= implode(",\n", $values); + $out .= "\n\t\t),\n"; + } + $out .= "\t)"; + return $out; + } + +/** + * Interact with the user to get a custom SQL condition and use that to extract data + * to build a fixture. + * + * @param string $modelName name of the model to take records from. + * @param string $useTable Name of table to use. + * @return array Array of records. + * @access protected + */ + function _getRecordsFromTable($modelName, $useTable = null) { + if ($this->interactive) { + $condition = null; + $prompt = __("Please provide a SQL fragment to use as conditions\nExample: WHERE 1=1 LIMIT 10", true); + while (!$condition) { + $condition = $this->in($prompt, null, 'WHERE 1=1 LIMIT 10'); + } + } else { + $condition = 'WHERE 1=1 LIMIT ' . (isset($this->params['count']) ? $this->params['count'] : 10); + } + App::import('Model', 'Model', false); + $modelObject =& new Model(array('name' => $modelName, 'table' => $useTable, 'ds' => $this->connection)); + $records = $modelObject->find('all', array( + 'conditions' => $condition, + 'recursive' => -1 + )); + $db =& ConnectionManager::getDataSource($modelObject->useDbConfig); + $schema = $modelObject->schema(true); + $out = array(); + foreach ($records as $record) { + $row = array(); + foreach ($record[$modelObject->alias] as $field => $value) { + $row[$field] = $db->value($value, $schema[$field]['type']); + } + $out[] = $row; + } + return $out; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake fixture "); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the fixture to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out('Commands:'); + $this->out("\nfixture \n\tbakes fixture with specified name."); + $this->out("\nfixture all\n\tbakes all fixtures."); + $this->out(); + $this->out('Parameters:'); + $this->out("\t-count When using generated data, the number of records to include in the fixture(s)."); + $this->out("\t-connection Which database configuration to use for baking."); + $this->out("\t-plugin CamelCased name of plugin to bake fixtures for."); + $this->out("\t-records Used with -count and /all commands to pull [n] records from the live tables"); + $this->out("\t Where [n] is either -count or the default of 10."); + $this->out(); + $this->_stop(); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/model.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/model.php new file mode 100644 index 000000000..4324e08e6 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/model.php @@ -0,0 +1,938 @@ +args)) { + $this->__interactive(); + } + + if (!empty($this->args[0])) { + $this->interactive = false; + if (!isset($this->connection)) { + $this->connection = 'default'; + } + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + $model = $this->_modelName($this->args[0]); + $object = $this->_getModelObject($model); + if ($this->bake($object, false)) { + if ($this->_checkUnitTest()) { + $this->bakeFixture($model); + $this->bakeTest($model); + } + } + } + } + +/** + * Bake all models at once. + * + * @return void + */ + function all() { + $this->listAll($this->connection, false); + $unitTestExists = $this->_checkUnitTest(); + foreach ($this->_tables as $table) { + if (in_array($table, $this->skipTables)) { + continue; + } + $modelClass = Inflector::classify($table); + $this->out(sprintf(__('Baking %s', true), $modelClass)); + $object = $this->_getModelObject($modelClass); + if ($this->bake($object, false) && $unitTestExists) { + $this->bakeFixture($modelClass); + $this->bakeTest($modelClass); + } + } + } + +/** + * Get a model object for a class name. + * + * @param string $className Name of class you want model to be. + * @return object Model instance + */ + function &_getModelObject($className, $table = null) { + if (!$table) { + $table = Inflector::tableize($className); + } + $object =& new Model(array('name' => $className, 'table' => $table, 'ds' => $this->connection)); + return $object; + } + +/** + * Generate a key value list of options and a prompt. + * + * @param array $options Array of options to use for the selections. indexes must start at 0 + * @param string $prompt Prompt to use for options list. + * @param integer $default The default option for the given prompt. + * @return result of user choice. + */ + function inOptions($options, $prompt = null, $default = null) { + $valid = false; + $max = count($options); + while (!$valid) { + foreach ($options as $i => $option) { + $this->out($i + 1 .'. ' . $option); + } + if (empty($prompt)) { + $prompt = __('Make a selection from the choices above', true); + } + $choice = $this->in($prompt, null, $default); + if (intval($choice) > 0 && intval($choice) <= $max) { + $valid = true; + } + } + return $choice - 1; + } + +/** + * Handles interactive baking + * + * @access private + */ + function __interactive() { + $this->hr(); + $this->out(sprintf("Bake Model\nPath: %s", $this->path)); + $this->hr(); + $this->interactive = true; + + $primaryKey = 'id'; + $validate = $associations = array(); + + if (empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + $currentModelName = $this->getName(); + $useTable = $this->getTable($currentModelName); + $db =& ConnectionManager::getDataSource($this->connection); + $fullTableName = $db->fullTableName($useTable); + + if (in_array($useTable, $this->_tables)) { + $tempModel = new Model(array('name' => $currentModelName, 'table' => $useTable, 'ds' => $this->connection)); + $fields = $tempModel->schema(true); + if (!array_key_exists('id', $fields)) { + $primaryKey = $this->findPrimaryKey($fields); + } + } else { + $this->err(sprintf(__('Table %s does not exist, cannot bake a model without a table.', true), $useTable)); + $this->_stop(); + return false; + } + $displayField = $tempModel->hasField(array('name', 'title')); + if (!$displayField) { + $displayField = $this->findDisplayField($tempModel->schema()); + } + + $prompt = __("Would you like to supply validation criteria \nfor the fields in your model?", true); + $wannaDoValidation = $this->in($prompt, array('y','n'), 'y'); + if (array_search($useTable, $this->_tables) !== false && strtolower($wannaDoValidation) == 'y') { + $validate = $this->doValidation($tempModel); + } + + $prompt = __("Would you like to define model associations\n(hasMany, hasOne, belongsTo, etc.)?", true); + $wannaDoAssoc = $this->in($prompt, array('y','n'), 'y'); + if (strtolower($wannaDoAssoc) == 'y') { + $associations = $this->doAssociations($tempModel); + } + + $this->out(); + $this->hr(); + $this->out(__('The following Model will be created:', true)); + $this->hr(); + $this->out("Name: " . $currentModelName); + + if ($this->connection !== 'default') { + $this->out(sprintf(__("DB Config: %s", true), $this->connection)); + } + if ($fullTableName !== Inflector::tableize($currentModelName)) { + $this->out(sprintf(__("DB Table: %s", true), $fullTableName)); + } + if ($primaryKey != 'id') { + $this->out(sprintf(__("Primary Key: %s", true), $primaryKey)); + } + if (!empty($validate)) { + $this->out(sprintf(__("Validation: %s", true), print_r($validate, true))); + } + if (!empty($associations)) { + $this->out(__("Associations:", true)); + $assocKeys = array('belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany'); + foreach ($assocKeys as $assocKey) { + $this->_printAssociation($currentModelName, $assocKey, $associations); + } + } + + $this->hr(); + $looksGood = $this->in(__('Look okay?', true), array('y','n'), 'y'); + + if (strtolower($looksGood) == 'y') { + $vars = compact('associations', 'validate', 'primaryKey', 'useTable', 'displayField'); + $vars['useDbConfig'] = $this->connection; + if ($this->bake($currentModelName, $vars)) { + if ($this->_checkUnitTest()) { + $this->bakeFixture($currentModelName, $useTable); + $this->bakeTest($currentModelName, $useTable, $associations); + } + } + } else { + return false; + } + } + +/** + * Print out all the associations of a particular type + * + * @param string $modelName Name of the model relations belong to. + * @param string $type Name of association you want to see. i.e. 'belongsTo' + * @param string $associations Collection of associations. + * @access protected + * @return void + */ + function _printAssociation($modelName, $type, $associations) { + if (!empty($associations[$type])) { + for ($i = 0; $i < count($associations[$type]); $i++) { + $out = "\t" . $modelName . ' ' . $type . ' ' . $associations[$type][$i]['alias']; + $this->out($out); + } + } + } + +/** + * Finds a primary Key in a list of fields. + * + * @param array $fields Array of fields that might have a primary key. + * @return string Name of field that is a primary key. + * @access public + */ + function findPrimaryKey($fields) { + foreach ($fields as $name => $field) { + if (isset($field['key']) && $field['key'] == 'primary') { + break; + } + } + return $this->in(__('What is the primaryKey?', true), null, $name); + } + +/** + * interact with the user to find the displayField value for a model. + * + * @param array $fields Array of fields to look for and choose as a displayField + * @return mixed Name of field to use for displayField or false if the user declines to choose + */ + function findDisplayField($fields) { + $fieldNames = array_keys($fields); + $prompt = __("A displayField could not be automatically detected\nwould you like to choose one?", true); + $continue = $this->in($prompt, array('y', 'n')); + if (strtolower($continue) == 'n') { + return false; + } + $prompt = __('Choose a field from the options above:', true); + $choice = $this->inOptions($fieldNames, $prompt); + return $fieldNames[$choice]; + } + +/** + * Handles Generation and user interaction for creating validation. + * + * @param object $model Model to have validations generated for. + * @return array $validate Array of user selected validations. + * @access public + */ + function doValidation(&$model) { + if (!is_object($model)) { + return false; + } + $fields = $model->schema(); + + if (empty($fields)) { + return false; + } + $validate = array(); + $this->initValidations(); + foreach ($fields as $fieldName => $field) { + $validation = $this->fieldValidation($fieldName, $field, $model->primaryKey); + if (!empty($validation)) { + $validate[$fieldName] = $validation; + } + } + return $validate; + } + +/** + * Populate the _validations array + * + * @return void + */ + function initValidations() { + $options = $choices = array(); + if (class_exists('Validation')) { + $parent = get_class_methods(get_parent_class('Validation')); + $options = get_class_methods('Validation'); + $options = array_diff($options, $parent); + } + sort($options); + $default = 1; + foreach ($options as $key => $option) { + if ($option{0} != '_' && strtolower($option) != 'getinstance') { + $choices[$default] = strtolower($option); + $default++; + } + } + $choices[$default] = 'none'; // Needed since index starts at 1 + $this->_validations = $choices; + return $choices; + } + +/** + * Does individual field validation handling. + * + * @param string $fieldName Name of field to be validated. + * @param array $metaData metadata for field + * @return array Array of validation for the field. + */ + function fieldValidation($fieldName, $metaData, $primaryKey = 'id') { + $defaultChoice = count($this->_validations); + $validate = $alreadyChosen = array(); + + $anotherValidator = 'y'; + while ($anotherValidator == 'y') { + if ($this->interactive) { + $this->out(); + $this->out(sprintf(__('Field: %s', true), $fieldName)); + $this->out(sprintf(__('Type: %s', true), $metaData['type'])); + $this->hr(); + $this->out(__('Please select one of the following validation options:', true)); + $this->hr(); + } + + $prompt = ''; + for ($i = 1; $i < $defaultChoice; $i++) { + $prompt .= $i . ' - ' . $this->_validations[$i] . "\n"; + } + $prompt .= sprintf(__("%s - Do not do any validation on this field.\n", true), $defaultChoice); + $prompt .= __("... or enter in a valid regex validation string.\n", true); + + $methods = array_flip($this->_validations); + $guess = $defaultChoice; + if ($metaData['null'] != 1 && !in_array($fieldName, array($primaryKey, 'created', 'modified', 'updated'))) { + if ($fieldName == 'email') { + $guess = $methods['email']; + } elseif ($metaData['type'] == 'string' && $metaData['length'] == 36) { + $guess = $methods['uuid']; + } elseif ($metaData['type'] == 'string') { + $guess = $methods['notempty']; + } elseif ($metaData['type'] == 'integer') { + $guess = $methods['numeric']; + } elseif ($metaData['type'] == 'boolean') { + $guess = $methods['boolean']; + } elseif ($metaData['type'] == 'date') { + $guess = $methods['date']; + } elseif ($metaData['type'] == 'time') { + $guess = $methods['time']; + } + } + + if ($this->interactive === true) { + $choice = $this->in($prompt, null, $guess); + if (in_array($choice, $alreadyChosen)) { + $this->out(__("You have already chosen that validation rule,\nplease choose again", true)); + continue; + } + if (!isset($this->_validations[$choice]) && is_numeric($choice)) { + $this->out(__('Please make a valid selection.', true)); + continue; + } + $alreadyChosen[] = $choice; + } else { + $choice = $guess; + } + + if (isset($this->_validations[$choice])) { + $validatorName = $this->_validations[$choice]; + } else { + $validatorName = Inflector::slug($choice); + } + + if ($choice != $defaultChoice) { + if (is_numeric($choice) && isset($this->_validations[$choice])) { + $validate[$validatorName] = $this->_validations[$choice]; + } else { + $validate[$validatorName] = $choice; + } + } + if ($this->interactive == true && $choice != $defaultChoice) { + $anotherValidator = $this->in(__('Would you like to add another validation rule?', true), array('y', 'n'), 'n'); + } else { + $anotherValidator = 'n'; + } + } + return $validate; + } + +/** + * Handles associations + * + * @param object $model + * @return array $assocaitons + * @access public + */ + function doAssociations(&$model) { + if (!is_object($model)) { + return false; + } + if ($this->interactive === true) { + $this->out(__('One moment while the associations are detected.', true)); + } + + $fields = $model->schema(true); + if (empty($fields)) { + return false; + } + + if (empty($this->_tables)) { + $this->_tables = $this->getAllTables(); + } + + $associations = array( + 'belongsTo' => array(), 'hasMany' => array(), 'hasOne'=> array(), 'hasAndBelongsToMany' => array() + ); + $possibleKeys = array(); + + $associations = $this->findBelongsTo($model, $associations); + $associations = $this->findHasOneAndMany($model, $associations); + $associations = $this->findHasAndBelongsToMany($model, $associations); + + if ($this->interactive !== true) { + unset($associations['hasOne']); + } + + if ($this->interactive === true) { + $this->hr(); + if (empty($associations)) { + $this->out(__('None found.', true)); + } else { + $this->out(__('Please confirm the following associations:', true)); + $this->hr(); + $associations = $this->confirmAssociations($model, $associations); + } + $associations = $this->doMoreAssociations($model, $associations); + } + return $associations; + } + +/** + * Find belongsTo relations and add them to the associations list. + * + * @param object $model Model instance of model being generated. + * @param array $associations Array of inprogress associations + * @return array $associations with belongsTo added in. + */ + function findBelongsTo(&$model, $associations) { + $fields = $model->schema(true); + foreach ($fields as $fieldName => $field) { + $offset = strpos($fieldName, '_id'); + if ($fieldName != $model->primaryKey && $fieldName != 'parent_id' && $offset !== false) { + $tmpModelName = $this->_modelNameFromKey($fieldName); + $associations['belongsTo'][] = array( + 'alias' => $tmpModelName, + 'className' => $tmpModelName, + 'foreignKey' => $fieldName, + ); + } elseif ($fieldName == 'parent_id') { + $associations['belongsTo'][] = array( + 'alias' => 'Parent' . $model->name, + 'className' => $model->name, + 'foreignKey' => $fieldName, + ); + } + } + return $associations; + } + +/** + * Find the hasOne and HasMany relations and add them to associations list + * + * @param object $model Model instance being generated + * @param array $associations Array of inprogress associations + * @return array $associations with hasOne and hasMany added in. + */ + function findHasOneAndMany(&$model, $associations) { + $foreignKey = $this->_modelKey($model->name); + foreach ($this->_tables as $otherTable) { + $tempOtherModel = $this->_getModelObject($this->_modelName($otherTable), $otherTable); + $modelFieldsTemp = $tempOtherModel->schema(true); + + $pattern = '/_' . preg_quote($model->table, '/') . '|' . preg_quote($model->table, '/') . '_/'; + $possibleJoinTable = preg_match($pattern , $otherTable); + if ($possibleJoinTable == true) { + continue; + } + foreach ($modelFieldsTemp as $fieldName => $field) { + $assoc = false; + if ($fieldName != $model->primaryKey && $fieldName == $foreignKey) { + $assoc = array( + 'alias' => $tempOtherModel->name, + 'className' => $tempOtherModel->name, + 'foreignKey' => $fieldName + ); + } elseif ($otherTable == $model->table && $fieldName == 'parent_id') { + $assoc = array( + 'alias' => 'Child' . $model->name, + 'className' => $model->name, + 'foreignKey' => $fieldName + ); + } + if ($assoc) { + $associations['hasOne'][] = $assoc; + $associations['hasMany'][] = $assoc; + } + + } + } + return $associations; + } + +/** + * Find the hasAndBelongsToMany relations and add them to associations list + * + * @param object $model Model instance being generated + * @param array $associations Array of inprogress associations + * @return array $associations with hasAndBelongsToMany added in. + */ + function findHasAndBelongsToMany(&$model, $associations) { + $foreignKey = $this->_modelKey($model->name); + foreach ($this->_tables as $otherTable) { + $tempOtherModel = $this->_getModelObject($this->_modelName($otherTable), $otherTable); + $modelFieldsTemp = $tempOtherModel->schema(true); + + $offset = strpos($otherTable, $model->table . '_'); + $otherOffset = strpos($otherTable, '_' . $model->table); + + if ($offset !== false) { + $offset = strlen($model->table . '_'); + $habtmName = $this->_modelName(substr($otherTable, $offset)); + $associations['hasAndBelongsToMany'][] = array( + 'alias' => $habtmName, + 'className' => $habtmName, + 'foreignKey' => $foreignKey, + 'associationForeignKey' => $this->_modelKey($habtmName), + 'joinTable' => $otherTable + ); + } elseif ($otherOffset !== false) { + $habtmName = $this->_modelName(substr($otherTable, 0, $otherOffset)); + $associations['hasAndBelongsToMany'][] = array( + 'alias' => $habtmName, + 'className' => $habtmName, + 'foreignKey' => $foreignKey, + 'associationForeignKey' => $this->_modelKey($habtmName), + 'joinTable' => $otherTable + ); + } + } + return $associations; + } + +/** + * Interact with the user and confirm associations. + * + * @param array $model Temporary Model instance. + * @param array $associations Array of associations to be confirmed. + * @return array Array of confirmed associations + */ + function confirmAssociations(&$model, $associations) { + foreach ($associations as $type => $settings) { + if (!empty($associations[$type])) { + $count = count($associations[$type]); + $response = 'y'; + foreach ($associations[$type] as $i => $assoc) { + $prompt = "{$model->name} {$type} {$assoc['alias']}?"; + $response = $this->in($prompt, array('y','n'), 'y'); + + if ('n' == strtolower($response)) { + unset($associations[$type][$i]); + } elseif ($type == 'hasMany') { + unset($associations['hasOne'][$i]); + } + } + $associations[$type] = array_merge($associations[$type]); + } + } + return $associations; + } + +/** + * Interact with the user and generate additional non-conventional associations + * + * @param object $model Temporary model instance + * @param array $associations Array of associations. + * @return array Array of associations. + */ + function doMoreAssociations($model, $associations) { + $prompt = __('Would you like to define some additional model associations?', true); + $wannaDoMoreAssoc = $this->in($prompt, array('y','n'), 'n'); + $possibleKeys = $this->_generatePossibleKeys(); + while (strtolower($wannaDoMoreAssoc) == 'y') { + $assocs = array('belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany'); + $this->out(__('What is the association type?', true)); + $assocType = intval($this->inOptions($assocs, __('Enter a number',true))); + + $this->out(__("For the following options be very careful to match your setup exactly.\nAny spelling mistakes will cause errors.", true)); + $this->hr(); + + $alias = $this->in(__('What is the alias for this association?', true)); + $className = $this->in(sprintf(__('What className will %s use?', true), $alias), null, $alias ); + $suggestedForeignKey = null; + + if ($assocType == 0) { + $showKeys = $possibleKeys[$model->table]; + $suggestedForeignKey = $this->_modelKey($alias); + } else { + $otherTable = Inflector::tableize($className); + if (in_array($otherTable, $this->_tables)) { + if ($assocType < 3) { + $showKeys = $possibleKeys[$otherTable]; + } else { + $showKeys = null; + } + } else { + $otherTable = $this->in(__('What is the table for this model?', true)); + $showKeys = $possibleKeys[$otherTable]; + } + $suggestedForeignKey = $this->_modelKey($model->name); + } + if (!empty($showKeys)) { + $this->out(__('A helpful List of possible keys', true)); + $foreignKey = $this->inOptions($showKeys, __('What is the foreignKey?', true)); + $foreignKey = $showKeys[intval($foreignKey)]; + } + if (!isset($foreignKey)) { + $foreignKey = $this->in(__('What is the foreignKey? Specify your own.', true), null, $suggestedForeignKey); + } + if ($assocType == 3) { + $associationForeignKey = $this->in(__('What is the associationForeignKey?', true), null, $this->_modelKey($model->name)); + $joinTable = $this->in(__('What is the joinTable?', true)); + } + $associations[$assocs[$assocType]] = array_values((array)$associations[$assocs[$assocType]]); + $count = count($associations[$assocs[$assocType]]); + $i = ($count > 0) ? $count : 0; + $associations[$assocs[$assocType]][$i]['alias'] = $alias; + $associations[$assocs[$assocType]][$i]['className'] = $className; + $associations[$assocs[$assocType]][$i]['foreignKey'] = $foreignKey; + if ($assocType == 3) { + $associations[$assocs[$assocType]][$i]['associationForeignKey'] = $associationForeignKey; + $associations[$assocs[$assocType]][$i]['joinTable'] = $joinTable; + } + $wannaDoMoreAssoc = $this->in(__('Define another association?', true), array('y','n'), 'y'); + } + return $associations; + } + +/** + * Finds all possible keys to use on custom associations. + * + * @return array array of tables and possible keys + */ + function _generatePossibleKeys() { + $possible = array(); + foreach ($this->_tables as $otherTable) { + $tempOtherModel = & new Model(array('table' => $otherTable, 'ds' => $this->connection)); + $modelFieldsTemp = $tempOtherModel->schema(true); + foreach ($modelFieldsTemp as $fieldName => $field) { + if ($field['type'] == 'integer' || $field['type'] == 'string') { + $possible[$otherTable][] = $fieldName; + } + } + } + return $possible; + } + +/** + * Assembles and writes a Model file. + * + * @param mixed $name Model name or object + * @param mixed $data if array and $name is not an object assume bake data, otherwise boolean. + * @access private + */ + function bake($name, $data = array()) { + if (is_object($name)) { + if ($data == false) { + $data = $associations = array(); + $data['associations'] = $this->doAssociations($name, $associations); + $data['validate'] = $this->doValidation($name); + } + $data['primaryKey'] = $name->primaryKey; + $data['useTable'] = $name->table; + $data['useDbConfig'] = $name->useDbConfig; + $data['name'] = $name = $name->name; + } else { + $data['name'] = $name; + } + $defaults = array('associations' => array(), 'validate' => array(), 'primaryKey' => 'id', + 'useTable' => null, 'useDbConfig' => 'default', 'displayField' => null); + $data = array_merge($defaults, $data); + + $this->Template->set($data); + $this->Template->set('plugin', Inflector::camelize($this->plugin)); + $out = $this->Template->generate('classes', 'model'); + + $path = $this->getPath(); + $filename = $path . Inflector::underscore($name) . '.php'; + $this->out("\nBaking model class for $name..."); + $this->createFile($filename, $out); + ClassRegistry::flush(); + return $out; + } + +/** + * Assembles and writes a unit test file + * + * @param string $className Model class name + * @access private + */ + function bakeTest($className) { + $this->Test->interactive = $this->interactive; + $this->Test->plugin = $this->plugin; + $this->Test->connection = $this->connection; + return $this->Test->bake('Model', $className); + } + +/** + * outputs the a list of possible models or controllers from database + * + * @param string $useDbConfig Database configuration name + * @access public + */ + function listAll($useDbConfig = null) { + $this->_tables = $this->getAllTables($useDbConfig); + + if ($this->interactive === true) { + $this->out(__('Possible Models based on your current database:', true)); + $this->_modelNames = array(); + $count = count($this->_tables); + for ($i = 0; $i < $count; $i++) { + $this->_modelNames[] = $this->_modelName($this->_tables[$i]); + $this->out($i + 1 . ". " . $this->_modelNames[$i]); + } + } + return $this->_tables; + } + +/** + * Interact with the user to determine the table name of a particular model + * + * @param string $modelName Name of the model you want a table for. + * @param string $useDbConfig Name of the database config you want to get tables from. + * @return void + */ + function getTable($modelName, $useDbConfig = null) { + if (!isset($useDbConfig)) { + $useDbConfig = $this->connection; + } + App::import('Model', 'ConnectionManager', false); + + $db =& ConnectionManager::getDataSource($useDbConfig); + $useTable = Inflector::tableize($modelName); + $fullTableName = $db->fullTableName($useTable, false); + $tableIsGood = false; + + if (array_search($useTable, $this->_tables) === false) { + $this->out(); + $this->out(sprintf(__("Given your model named '%s',\nCake would expect a database table named '%s'", true), $modelName, $fullTableName)); + $tableIsGood = $this->in(__('Do you want to use this table?', true), array('y','n'), 'y'); + } + if (strtolower($tableIsGood) == 'n') { + $useTable = $this->in(__('What is the name of the table?', true)); + } + return $useTable; + } + +/** + * Get an Array of all the tables in the supplied connection + * will halt the script if no tables are found. + * + * @param string $useDbConfig Connection name to scan. + * @return array Array of tables in the database. + */ + function getAllTables($useDbConfig = null) { + if (!isset($useDbConfig)) { + $useDbConfig = $this->connection; + } + App::import('Model', 'ConnectionManager', false); + + $tables = array(); + $db =& ConnectionManager::getDataSource($useDbConfig); + $db->cacheSources = false; + $usePrefix = empty($db->config['prefix']) ? '' : $db->config['prefix']; + if ($usePrefix) { + foreach ($db->listSources() as $table) { + if (!strncmp($table, $usePrefix, strlen($usePrefix))) { + $tables[] = substr($table, strlen($usePrefix)); + } + } + } else { + $tables = $db->listSources(); + } + if (empty($tables)) { + $this->err(__('Your database does not have any tables.', true)); + $this->_stop(); + } + return $tables; + } + +/** + * Forces the user to specify the model he wants to bake, and returns the selected model name. + * + * @return string the model name + * @access public + */ + function getName($useDbConfig = null) { + $this->listAll($useDbConfig); + + $enteredModel = ''; + + while ($enteredModel == '') { + $enteredModel = $this->in(__("Enter a number from the list above,\ntype in the name of another model, or 'q' to exit", true), null, 'q'); + + if ($enteredModel === 'q') { + $this->out(__("Exit", true)); + $this->_stop(); + } + + if ($enteredModel == '' || intval($enteredModel) > count($this->_modelNames)) { + $this->err(__("The model name you supplied was empty,\nor the number you selected was not an option. Please try again.", true)); + $enteredModel = ''; + } + } + if (intval($enteredModel) > 0 && intval($enteredModel) <= count($this->_modelNames)) { + $currentModelName = $this->_modelNames[intval($enteredModel) - 1]; + } else { + $currentModelName = $enteredModel; + } + return $currentModelName; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake model "); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the model to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out('Params:'); + $this->out(); + $this->out('-connection '); + $this->out("\tset db config . uses 'default' if none is specified"); + $this->out(); + $this->out('Commands:'); + $this->out(); + $this->out("model"); + $this->out("\tbakes model in interactive mode."); + $this->out(); + $this->out("model "); + $this->out("\tbakes model file with no associations or validation"); + $this->out(); + $this->out("model all"); + $this->out("\tbakes all model files with associations and validation"); + $this->out(); + $this->_stop(); + } + +/** + * Interact with FixtureTask to automatically bake fixtures when baking models. + * + * @param string $className Name of class to bake fixture for + * @param string $useTable Optional table name for fixture to use. + * @access public + * @return void + * @see FixtureTask::bake + */ + function bakeFixture($className, $useTable = null) { + $this->Fixture->interactive = $this->interactive; + $this->Fixture->connection = $this->connection; + $this->Fixture->plugin = $this->plugin; + $this->Fixture->bake($className, $useTable); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/plugin.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/plugin.php new file mode 100644 index 000000000..94d9e261c --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/plugin.php @@ -0,0 +1,247 @@ +path = APP . 'plugins' . DS; + } + +/** + * Execution method always used for tasks + * + * @return void + */ + function execute() { + if (empty($this->params['skel'])) { + $this->params['skel'] = ''; + if (is_dir(CAKE_CORE_INCLUDE_PATH . DS . CAKE . 'console' . DS . 'templates' . DS . 'skel') === true) { + $this->params['skel'] = CAKE_CORE_INCLUDE_PATH . DS . CAKE . 'console' . DS . 'templates' . DS . 'skel'; + } + } + $plugin = null; + + if (isset($this->args[0])) { + $plugin = Inflector::camelize($this->args[0]); + $pluginPath = $this->_pluginPath($plugin); + $this->Dispatch->shiftArgs(); + if (is_dir($pluginPath)) { + $this->out(sprintf(__('Plugin: %s', true), $plugin)); + $this->out(sprintf(__('Path: %s', true), $pluginPath)); + } elseif (isset($this->args[0])) { + $this->err(sprintf(__('%s in path %s not found.', true), $plugin, $pluginPath)); + $this->_stop(); + } else { + $this->__interactive($plugin); + } + } else { + return $this->__interactive(); + } + + if (isset($this->args[0])) { + $task = Inflector::classify($this->args[0]); + $this->Dispatch->shiftArgs(); + if (in_array($task, $this->tasks)) { + $this->{$task}->plugin = $plugin; + $this->{$task}->path = $pluginPath . Inflector::underscore(Inflector::pluralize($task)) . DS; + + if (!is_dir($this->{$task}->path)) { + $this->err(sprintf(__("%s directory could not be found.\nBe sure you have created %s", true), $task, $this->{$task}->path)); + } + $this->{$task}->loadTasks(); + return $this->{$task}->execute(); + } + } + } + +/** + * Interactive interface + * + * @access private + * @return void + */ + function __interactive($plugin = null) { + while ($plugin === null) { + $plugin = $this->in(__('Enter the name of the plugin in CamelCase format', true)); + } + + if (!$this->bake($plugin)) { + $this->err(sprintf(__("An error occured trying to bake: %s in %s", true), $plugin, $this->path . Inflector::underscore($pluginPath))); + } + } + +/** + * Bake the plugin, create directories and files + * + * @params $plugin name of the plugin in CamelCased format + * @access public + * @return bool + */ + function bake($plugin) { + $pluginPath = Inflector::underscore($plugin); + + $pathOptions = App::path('plugins'); + if (count($pathOptions) > 1) { + $this->findPath($pathOptions); + } + $this->hr(); + $this->out(sprintf(__("Plugin Name: %s", true), $plugin)); + $this->out(sprintf(__("Plugin Directory: %s", true), $this->path . $pluginPath)); + $this->hr(); + + $looksGood = $this->in(__('Look okay?', true), array('y', 'n', 'q'), 'y'); + + if (strtolower($looksGood) == 'y') { + $verbose = $this->in(__('Do you want verbose output?', true), array('y', 'n'), 'n'); + + $Folder =& new Folder($this->path . $pluginPath); + $directories = array( + 'config' . DS . 'schema', + 'models' . DS . 'behaviors', + 'models' . DS . 'datasources', + 'controllers' . DS . 'components', + 'libs', + 'views' . DS . 'helpers', + 'tests' . DS . 'cases' . DS . 'components', + 'tests' . DS . 'cases' . DS . 'helpers', + 'tests' . DS . 'cases' . DS . 'behaviors', + 'tests' . DS . 'cases' . DS . 'controllers', + 'tests' . DS . 'cases' . DS . 'models', + 'tests' . DS . 'groups', + 'tests' . DS . 'fixtures', + 'vendors', + 'vendors' . DS . 'shells' . DS . 'tasks', + 'webroot' + ); + + foreach ($directories as $directory) { + $dirPath = $this->path . $pluginPath . DS . $directory; + $Folder->create($dirPath); + $File =& new File($dirPath . DS . 'empty', true); + } + + if (strtolower($verbose) == 'y') { + foreach ($Folder->messages() as $message) { + $this->out($message); + } + } + + $errors = $Folder->errors(); + if (!empty($errors)) { + return false; + } + + $controllerFileName = $pluginPath . '_app_controller.php'; + + $out = ""; + $this->createFile($this->path . $pluginPath. DS . $controllerFileName, $out); + + $modelFileName = $pluginPath . '_app_model.php'; + + $out = ""; + $this->createFile($this->path . $pluginPath . DS . $modelFileName, $out); + + $this->hr(); + $this->out(sprintf(__("Created: %s in %s", true), $plugin, $this->path . $pluginPath)); + $this->hr(); + } + + return true; + } + +/** + * find and change $this->path to the user selection + * + * @return void + */ + function findPath($pathOptions) { + $valid = false; + $max = count($pathOptions); + while (!$valid) { + foreach ($pathOptions as $i => $option) { + $this->out($i + 1 .'. ' . $option); + } + $prompt = __('Choose a plugin path from the paths above.', true); + $choice = $this->in($prompt); + if (intval($choice) > 0 && intval($choice) <= $max) { + $valid = true; + } + } + $this->path = $pathOptions[$choice - 1]; + } + +/** + * Help + * + * @return void + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake plugin ..."); + $this->hr(); + $this->out('Commands:'); + $this->out(); + $this->out("plugin "); + $this->out("\tbakes plugin directory structure"); + $this->out(); + $this->out("plugin model"); + $this->out("\tbakes model. Run 'cake bake model help' for more info."); + $this->out(); + $this->out("plugin controller"); + $this->out("\tbakes controller. Run 'cake bake controller help' for more info."); + $this->out(); + $this->out("plugin view"); + $this->out("\tbakes view. Run 'cake bake view help' for more info."); + $this->out(); + $this->_stop(); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/project.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/project.php new file mode 100644 index 000000000..7266dc0a2 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/project.php @@ -0,0 +1,371 @@ +args[0])) { + $project = $this->args[0]; + } + } + + if ($project) { + $this->Dispatch->parseParams(array('-app', $project)); + $project = $this->params['working']; + } + + if (empty($this->params['skel'])) { + $this->params['skel'] = ''; + if (is_dir(CAKE . 'console' . DS . 'templates' . DS . 'skel') === true) { + $this->params['skel'] = CAKE . 'console' . DS . 'templates' . DS . 'skel'; + } + } + + while (!$project) { + $prompt = __("What is the full path for this app including the app directory name?\n Example:", true); + $default = $this->params['working'] . DS . 'myapp'; + $project = $this->in($prompt . $default, null, $default); + } + + if ($project) { + $response = false; + while ($response == false && is_dir($project) === true && file_exists($project . 'config' . 'core.php')) { + $prompt = sprintf(__('A project already exists in this location: %s Overwrite?', true), $project); + $response = $this->in($prompt, array('y','n'), 'n'); + if (strtolower($response) === 'n') { + $response = $project = false; + } + } + } + + if ($this->bake($project)) { + $path = Folder::slashTerm($project); + if ($this->createHome($path)) { + $this->out(__('Welcome page created', true)); + } else { + $this->out(__('The Welcome page was NOT created', true)); + } + + if ($this->securitySalt($path) === true ) { + $this->out(__('Random hash key created for \'Security.salt\'', true)); + } else { + $this->err(sprintf(__('Unable to generate random hash for \'Security.salt\', you should change it in %s', true), CONFIGS . 'core.php')); + } + + if ($this->securityCipherSeed($path) === true ) { + $this->out(__('Random seed created for \'Security.cipherSeed\'', true)); + } else { + $this->err(sprintf(__('Unable to generate random seed for \'Security.cipherSeed\', you should change it in %s', true), CONFIGS . 'core.php')); + } + + $corePath = $this->corePath($path); + if ($corePath === true ) { + $this->out(sprintf(__('CAKE_CORE_INCLUDE_PATH set to %s in webroot/index.php', true), CAKE_CORE_INCLUDE_PATH)); + $this->out(sprintf(__('CAKE_CORE_INCLUDE_PATH set to %s in webroot/test.php', true), CAKE_CORE_INCLUDE_PATH)); + $this->out(__('Remember to check these value after moving to production server', true)); + } elseif ($corePath === false) { + $this->err(sprintf(__('Unable to set CAKE_CORE_INCLUDE_PATH, you should change it in %s', true), $path . 'webroot' .DS .'index.php')); + } + $Folder = new Folder($path); + if (!$Folder->chmod($path . 'tmp', 0777)) { + $this->err(sprintf(__('Could not set permissions on %s', true), $path . DS .'tmp')); + $this->out(sprintf(__('chmod -R 0777 %s', true), $path . DS .'tmp')); + } + + $this->params['working'] = $path; + $this->params['app'] = basename($path); + return true; + } + } + +/** + * Looks for a skeleton template of a Cake application, + * and if not found asks the user for a path. When there is a path + * this method will make a deep copy of the skeleton to the project directory. + * A default home page will be added, and the tmp file storage will be chmod'ed to 0777. + * + * @param string $path Project path + * @param string $skel Path to copy from + * @param string $skip array of directories to skip when copying + * @access private + */ + function bake($path, $skel = null, $skip = array('empty')) { + if (!$skel) { + $skel = $this->params['skel']; + } + while (!$skel) { + $skel = $this->in(sprintf(__("What is the path to the directory layout you wish to copy?\nExample: %s"), APP, null, ROOT . DS . 'myapp' . DS)); + if ($skel == '') { + $this->out(__('The directory path you supplied was empty. Please try again.', true)); + } else { + while (is_dir($skel) === false) { + $skel = $this->in(__('Directory path does not exist please choose another:', true)); + } + } + } + + $app = basename($path); + + $this->out(__('Bake Project', true)); + $this->out(__("Skel Directory: ", true) . $skel); + $this->out(__("Will be copied to: ", true) . $path); + $this->hr(); + + $looksGood = $this->in(__('Look okay?', true), array('y', 'n', 'q'), 'y'); + + if (strtolower($looksGood) == 'y') { + $verbose = $this->in(__('Do you want verbose output?', true), array('y', 'n'), 'n'); + + $Folder = new Folder($skel); + if (!empty($this->params['empty'])) { + $skip = array(); + } + if ($Folder->copy(array('to' => $path, 'skip' => $skip))) { + $this->hr(); + $this->out(sprintf(__("Created: %s in %s", true), $app, $path)); + $this->hr(); + } else { + $this->err(sprintf(__(" '%s' could not be created properly", true), $app)); + return false; + } + + if (strtolower($verbose) == 'y') { + foreach ($Folder->messages() as $message) { + $this->out($message); + } + } + + return true; + } elseif (strtolower($looksGood) == 'q') { + $this->out(__('Bake Aborted.', true)); + } else { + $this->execute(false); + return false; + } + } + +/** + * Writes a file with a default home page to the project. + * + * @param string $dir Path to project + * @return boolean Success + * @access public + */ + function createHome($dir) { + $app = basename($dir); + $path = $dir . 'views' . DS . 'pages' . DS; + $source = CAKE . 'console' . DS . 'templates' . DS .'default' . DS . 'views' . DS . 'home.ctp'; + include($source); + return $this->createFile($path.'home.ctp', $output); + } + +/** + * Generates and writes 'Security.salt' + * + * @param string $path Project path + * @return boolean Success + * @access public + */ + function securitySalt($path) { + $File =& new File($path . 'config' . DS . 'core.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*Configure::write\\(\\\'Security.salt\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + if (!class_exists('Security')) { + require LIBS . 'security.php'; + } + $string = Security::generateAuthKey(); + $result = str_replace($match[0], "\t" . 'Configure::write(\'Security.salt\', \''.$string.'\');', $contents); + if ($File->write($result)) { + return true; + } + return false; + } + return false; + } + + /** + * Generates and writes 'Security.cipherSeed' + * + * @param string $path Project path + * @return boolean Success + * @access public + */ + function securityCipherSeed($path) { + $File =& new File($path . 'config' . DS . 'core.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*Configure::write\\(\\\'Security.cipherSeed\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + if (!class_exists('Security')) { + require LIBS . 'security.php'; + } + $string = substr(bin2hex(Security::generateAuthKey()), 0, 30); + $result = str_replace($match[0], "\t" . 'Configure::write(\'Security.cipherSeed\', \''.$string.'\');', $contents); + if ($File->write($result)) { + return true; + } + return false; + } + return false; + } + +/** + * Generates and writes CAKE_CORE_INCLUDE_PATH + * + * @param string $path Project path + * @return boolean Success + * @access public + */ + function corePath($path) { + if (dirname($path) !== CAKE_CORE_INCLUDE_PATH) { + $File =& new File($path . 'webroot' . DS . 'index.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*define\\(\\\'CAKE_CORE_INCLUDE_PATH\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + $root = strpos(CAKE_CORE_INCLUDE_PATH, '/') === 0 ? " DS . '" : "'"; + $result = str_replace($match[0], "\t\tdefine('CAKE_CORE_INCLUDE_PATH', " . $root . str_replace(DS, "' . DS . '", trim(CAKE_CORE_INCLUDE_PATH, DS)) . "');", $contents); + if (!$File->write($result)) { + return false; + } + } else { + return false; + } + + $File =& new File($path . 'webroot' . DS . 'test.php'); + $contents = $File->read(); + if (preg_match('/([\\t\\x20]*define\\(\\\'CAKE_CORE_INCLUDE_PATH\\\',[\\t\\x20\'A-z0-9]*\\);)/', $contents, $match)) { + $result = str_replace($match[0], "\t\tdefine('CAKE_CORE_INCLUDE_PATH', " . $root . str_replace(DS, "' . DS . '", trim(CAKE_CORE_INCLUDE_PATH, DS)) . "');", $contents); + if (!$File->write($result)) { + return false; + } + } else { + return false; + } + return true; + } + } + +/** + * Enables Configure::read('Routing.prefixes') in /app/config/core.php + * + * @param string $name Name to use as admin routing + * @return boolean Success + * @access public + */ + function cakeAdmin($name) { + $path = (empty($this->configPath)) ? CONFIGS : $this->configPath; + $File =& new File($path . 'core.php'); + $contents = $File->read(); + if (preg_match('%([/\\t\\x20]*Configure::write\(\'Routing.prefixes\',[\\t\\x20\'a-z,\)\(]*\\);)%', $contents, $match)) { + $result = str_replace($match[0], "\t" . 'Configure::write(\'Routing.prefixes\', array(\''.$name.'\'));', $contents); + if ($File->write($result)) { + Configure::write('Routing.prefixes', array($name)); + return true; + } else { + return false; + } + } else { + return false; + } + } + +/** + * Checks for Configure::read('Routing.prefixes') and forces user to input it if not enabled + * + * @return string Admin route to use + * @access public + */ + function getPrefix() { + $admin = ''; + $prefixes = Configure::read('Routing.prefixes'); + if (!empty($prefixes)) { + if (count($prefixes) == 1) { + return $prefixes[0] . '_'; + } + if ($this->interactive) { + $this->out(); + $this->out(__('You have more than one routing prefix configured', true)); + } + $options = array(); + foreach ($prefixes as $i => $prefix) { + $options[] = $i + 1; + if ($this->interactive) { + $this->out($i + 1 . '. ' . $prefix); + } + } + $selection = $this->in(__('Please choose a prefix to bake with.', true), $options, 1); + return $prefixes[$selection - 1] . '_'; + } + if ($this->interactive) { + $this->hr(); + $this->out('You need to enable Configure::write(\'Routing.prefixes\',array(\'admin\')) in /app/config/core.php to use prefix routing.'); + $this->out(__('What would you like the prefix route to be?', true)); + $this->out(__('Example: www.example.com/admin/controller', true)); + while ($admin == '') { + $admin = $this->in(__("Enter a routing prefix:", true), null, 'admin'); + } + if ($this->cakeAdmin($admin) !== true) { + $this->out(__('Unable to write to /app/config/core.php.', true)); + $this->out('You need to enable Configure::write(\'Routing.prefixes\',array(\'admin\')) in /app/config/core.php to use prefix routing.'); + $this->_stop(); + } + return $admin . '_'; + } + return ''; + } + +/** + * Help + * + * @return void + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake project "); + $this->hr(); + $this->out('Commands:'); + $this->out(); + $this->out("project "); + $this->out("\tbakes app directory structure."); + $this->out("\tif begins with '/' path is absolute."); + $this->out(); + $this->_stop(); + } + +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/template.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/template.php new file mode 100644 index 000000000..aac544abc --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/template.php @@ -0,0 +1,210 @@ + $path + * + * @var array + */ + var $templatePaths = array(); + +/** + * Initialize callback. Setup paths for the template task. + * + * @access public + * @return void + */ + function initialize() { + $this->templatePaths = $this->_findThemes(); + } + +/** + * Find the paths to all the installed shell themes in the app. + * + * Bake themes are directories not named `skel` inside a `vendors/shells/templates` path. + * + * @return array Array of bake themes that are installed. + */ + function _findThemes() { + $paths = App::path('shells'); + $core = array_pop($paths); + $separator = DS === '/' ? '/' : '\\\\'; + $core = preg_replace('#libs' . $separator . '$#', '', $core); + + $Folder =& new Folder($core . 'templates' . DS . 'default'); + $contents = $Folder->read(); + $themeFolders = $contents[0]; + + $plugins = App::objects('plugin'); + foreach ($plugins as $plugin) { + $paths[] = $this->_pluginPath($plugin) . 'vendors' . DS . 'shells' . DS; + } + $paths[] = $core; + + // TEMPORARY TODO remove when all paths are DS terminated + foreach ($paths as $i => $path) { + $paths[$i] = rtrim($path, DS) . DS; + } + + $themes = array(); + foreach ($paths as $path) { + $Folder =& new Folder($path . 'templates', false); + $contents = $Folder->read(); + $subDirs = $contents[0]; + foreach ($subDirs as $dir) { + if (empty($dir) || preg_match('@^skel$|_skel$@', $dir)) { + continue; + } + $Folder =& new Folder($path . 'templates' . DS . $dir); + $contents = $Folder->read(); + $subDirs = $contents[0]; + if (array_intersect($contents[0], $themeFolders)) { + $templateDir = $path . 'templates' . DS . $dir . DS; + $themes[$dir] = $templateDir; + } + } + } + return $themes; + } + +/** + * Set variable values to the template scope + * + * @param mixed $one A string or an array of data. + * @param mixed $two Value in case $one is a string (which then works as the key). + * Unused if $one is an associative array, otherwise serves as the values to $one's keys. + * @return void + */ + function set($one, $two = null) { + $data = null; + if (is_array($one)) { + if (is_array($two)) { + $data = array_combine($one, $two); + } else { + $data = $one; + } + } else { + $data = array($one => $two); + } + + if ($data == null) { + return false; + } + $this->templateVars = $data + $this->templateVars; + } + +/** + * Runs the template + * + * @param string $directory directory / type of thing you want + * @param string $filename template name + * @param string $vars Additional vars to set to template scope. + * @access public + * @return contents of generated code template + */ + function generate($directory, $filename, $vars = null) { + if ($vars !== null) { + $this->set($vars); + } + if (empty($this->templatePaths)) { + $this->initialize(); + } + $themePath = $this->getThemePath(); + $templateFile = $this->_findTemplate($themePath, $directory, $filename); + if ($templateFile) { + extract($this->templateVars); + ob_start(); + ob_implicit_flush(0); + include($templateFile); + $content = ob_get_clean(); + return $content; + } + return ''; + } + +/** + * Find the theme name for the current operation. + * If there is only one theme in $templatePaths it will be used. + * If there is a -theme param in the cli args, it will be used. + * If there is more than one installed theme user interaction will happen + * + * @return string returns the path to the selected theme. + */ + function getThemePath() { + if (count($this->templatePaths) == 1) { + $paths = array_values($this->templatePaths); + return $paths[0]; + } + if (!empty($this->params['theme']) && isset($this->templatePaths[$this->params['theme']])) { + return $this->templatePaths[$this->params['theme']]; + } + + $this->hr(); + $this->out(__('You have more than one set of templates installed.', true)); + $this->out(__('Please choose the template set you wish to use:', true)); + $this->hr(); + + $i = 1; + $indexedPaths = array(); + foreach ($this->templatePaths as $key => $path) { + $this->out($i . '. ' . $key); + $indexedPaths[$i] = $path; + $i++; + } + $index = $this->in(__('Which bake theme would you like to use?', true), range(1, $i - 1), 1); + $themeNames = array_keys($this->templatePaths); + $this->Dispatch->params['theme'] = $themeNames[$index - 1]; + return $indexedPaths[$index]; + } + +/** + * Find a template inside a directory inside a path. + * Will scan all other theme dirs if the template is not found in the first directory. + * + * @param string $path The initial path to look for the file on. If it is not found fallbacks will be used. + * @param string $directory Subdirectory to look for ie. 'views', 'objects' + * @param string $filename lower_case_underscored filename you want. + * @access public + * @return string filename will exit program if template is not found. + */ + function _findTemplate($path, $directory, $filename) { + $themeFile = $path . $directory . DS . $filename . '.ctp'; + if (file_exists($themeFile)) { + return $themeFile; + } + foreach ($this->templatePaths as $path) { + $templatePath = $path . $directory . DS . $filename . '.ctp'; + if (file_exists($templatePath)) { + return $templatePath; + } + } + $this->err(sprintf(__('Could not find template for %s', true), $filename)); + return false; + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/test.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/test.php new file mode 100644 index 000000000..ed9c7e433 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/test.php @@ -0,0 +1,469 @@ +args)) { + $this->__interactive(); + } + + if (count($this->args) == 1) { + $this->__interactive($this->args[0]); + } + + if (count($this->args) > 1) { + $type = Inflector::underscore($this->args[0]); + if ($this->bake($type, $this->args[1])) { + $this->out('done'); + } + } + } + +/** + * Handles interactive baking + * + * @access private + */ + function __interactive($type = null) { + $this->interactive = true; + $this->hr(); + $this->out(__('Bake Tests', true)); + $this->out(sprintf(__("Path: %s", true), $this->path)); + $this->hr(); + + if ($type) { + $type = Inflector::camelize($type); + if (!in_array($type, $this->classTypes)) { + $this->error(sprintf('Incorrect type provided. Please choose one of %s', implode(', ', $this->classTypes))); + } + } else { + $type = $this->getObjectType(); + } + $className = $this->getClassName($type); + return $this->bake($type, $className); + } + +/** + * Completes final steps for generating data to create test case. + * + * @param string $type Type of object to bake test case for ie. Model, Controller + * @param string $className the 'cake name' for the class ie. Posts for the PostsController + * @access public + */ + function bake($type, $className) { + if ($this->typeCanDetectFixtures($type) && $this->isLoadableClass($type, $className)) { + $this->out(__('Bake is detecting possible fixtures..', true)); + $testSubject =& $this->buildTestSubject($type, $className); + $this->generateFixtureList($testSubject); + } elseif ($this->interactive) { + $this->getUserFixtures(); + } + $fullClassName = $this->getRealClassName($type, $className); + + $methods = array(); + if (class_exists($fullClassName)) { + $methods = $this->getTestableMethods($fullClassName); + } + $mock = $this->hasMockClass($type, $fullClassName); + $construction = $this->generateConstructor($type, $fullClassName); + + $plugin = null; + if ($this->plugin) { + $plugin = $this->plugin . '.'; + } + + $this->Template->set('fixtures', $this->_fixtures); + $this->Template->set('plugin', $plugin); + $this->Template->set(compact('className', 'methods', 'type', 'fullClassName', 'mock', 'construction')); + $out = $this->Template->generate('classes', 'test'); + + $filename = $this->testCaseFileName($type, $className); + $made = $this->createFile($filename, $out); + if ($made) { + return $out; + } + return false; + } + +/** + * Interact with the user and get their chosen type. Can exit the script. + * + * @return string Users chosen type. + * @access public + */ + function getObjectType() { + $this->hr(); + $this->out(__("Select an object type:", true)); + $this->hr(); + + $keys = array(); + foreach ($this->classTypes as $key => $option) { + $this->out(++$key . '. ' . $option); + $keys[] = $key; + } + $keys[] = 'q'; + $selection = $this->in(__("Enter the type of object to bake a test for or (q)uit", true), $keys, 'q'); + if ($selection == 'q') { + return $this->_stop(); + } + return $this->classTypes[$selection - 1]; + } + +/** + * Get the user chosen Class name for the chosen type + * + * @param string $objectType Type of object to list classes for i.e. Model, Controller. + * @return string Class name the user chose. + * @access public + */ + function getClassName($objectType) { + $type = strtolower($objectType); + if ($this->plugin) { + $path = Inflector::pluralize($type); + if ($type === 'helper') { + $path = 'views' . DS . $path; + } elseif ($type === 'component') { + $path = 'controllers' . DS . $path; + } elseif ($type === 'behavior') { + $path = 'models' . DS . $path; + } + $options = App::objects($type, App::pluginPath($this->plugin) . $path, false); + } else { + $options = App::objects($type); + } + $this->out(sprintf(__('Choose a %s class', true), $objectType)); + $keys = array(); + foreach ($options as $key => $option) { + $this->out(++$key . '. ' . $option); + $keys[] = $key; + } + $selection = $this->in(__('Choose an existing class, or enter the name of a class that does not exist', true)); + if (isset($options[$selection - 1])) { + return $options[$selection - 1]; + } + return $selection; + } + +/** + * Checks whether the chosen type can find its own fixtures. + * Currently only model, and controller are supported + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return boolean + * @access public + */ + function typeCanDetectFixtures($type) { + $type = strtolower($type); + return ($type == 'controller' || $type == 'model'); + } + +/** + * Check if a class with the given type is loaded or can be loaded. + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return boolean + * @access public + */ + function isLoadableClass($type, $class) { + return App::import($type, $class); + } + +/** + * Construct an instance of the class to be tested. + * So that fixtures can be detected + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $class the Classname of the class the test is being generated for. + * @return object And instance of the class that is going to be tested. + * @access public + */ + function &buildTestSubject($type, $class) { + ClassRegistry::flush(); + App::import($type, $class); + $class = $this->getRealClassName($type, $class); + if (strtolower($type) == 'model') { + $instance =& ClassRegistry::init($class); + } else { + $instance =& new $class(); + } + return $instance; + } + +/** + * Gets the real class name from the cake short form. + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $class the Classname of the class the test is being generated for. + * @return string Real classname + * @access public + */ + function getRealClassName($type, $class) { + if (strtolower($type) == 'model') { + return $class; + } + return $class . $type; + } + +/** + * Get methods declared in the class given. + * No parent methods will be returned + * + * @param string $className Name of class to look at. + * @return array Array of method names. + * @access public + */ + function getTestableMethods($className) { + $classMethods = get_class_methods($className); + $parentMethods = get_class_methods(get_parent_class($className)); + $thisMethods = array_diff($classMethods, $parentMethods); + $out = array(); + foreach ($thisMethods as $method) { + if (substr($method, 0, 1) != '_' && $method != strtolower($className)) { + $out[] = $method; + } + } + return $out; + } + +/** + * Generate the list of fixtures that will be required to run this test based on + * loaded models. + * + * @param object $subject The object you want to generate fixtures for. + * @return array Array of fixtures to be included in the test. + * @access public + */ + function generateFixtureList(&$subject) { + $this->_fixtures = array(); + if (is_a($subject, 'Model')) { + $this->_processModel($subject); + } elseif (is_a($subject, 'Controller')) { + $this->_processController($subject); + } + return array_values($this->_fixtures); + } + +/** + * Process a model recursively and pull out all the + * model names converting them to fixture names. + * + * @param Model $subject A Model class to scan for associations and pull fixtures off of. + * @return void + * @access protected + */ + function _processModel(&$subject) { + $this->_addFixture($subject->name); + $associated = $subject->getAssociated(); + foreach ($associated as $alias => $type) { + $className = $subject->{$alias}->name; + if (!isset($this->_fixtures[$className])) { + $this->_processModel($subject->{$alias}); + } + if ($type == 'hasAndBelongsToMany') { + $joinModel = Inflector::classify($subject->hasAndBelongsToMany[$alias]['joinTable']); + if (!isset($this->_fixtures[$joinModel])) { + $this->_processModel($subject->{$joinModel}); + } + } + } + } + +/** + * Process all the models attached to a controller + * and generate a fixture list. + * + * @param Controller $subject A controller to pull model names off of. + * @return void + * @access protected + */ + function _processController(&$subject) { + $subject->constructClasses(); + $models = array(Inflector::classify($subject->name)); + if (!empty($subject->uses)) { + $models = $subject->uses; + } + foreach ($models as $model) { + $this->_processModel($subject->{$model}); + } + } + +/** + * Add classname to the fixture list. + * Sets the app. or plugin.plugin_name. prefix. + * + * @param string $name Name of the Model class that a fixture might be required for. + * @return void + * @access protected + */ + function _addFixture($name) { + $parent = get_parent_class($name); + $prefix = 'app.'; + if (strtolower($parent) != 'appmodel' && strtolower(substr($parent, -8)) == 'appmodel') { + $pluginName = substr($parent, 0, strlen($parent) -8); + $prefix = 'plugin.' . Inflector::underscore($pluginName) . '.'; + } + $fixture = $prefix . Inflector::underscore($name); + $this->_fixtures[$name] = $fixture; + } + +/** + * Interact with the user to get additional fixtures they want to use. + * + * @return array Array of fixtures the user wants to add. + * @access public + */ + function getUserFixtures() { + $proceed = $this->in(__('Bake could not detect fixtures, would you like to add some?', true), array('y','n'), 'n'); + $fixtures = array(); + if (strtolower($proceed) == 'y') { + $fixtureList = $this->in(__("Please provide a comma separated list of the fixtures names you'd like to use.\nExample: 'app.comment, app.post, plugin.forums.post'", true)); + $fixtureListTrimmed = str_replace(' ', '', $fixtureList); + $fixtures = explode(',', $fixtureListTrimmed); + } + $this->_fixtures = array_merge($this->_fixtures, $fixtures); + return $fixtures; + } + +/** + * Is a mock class required for this type of test? + * Controllers require a mock class. + * + * @param string $type The type of object tests are being generated for eg. controller. + * @return boolean + * @access public + */ + function hasMockClass($type) { + $type = strtolower($type); + return $type == 'controller'; + } + +/** + * Generate a constructor code snippet for the type and classname + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return string Constructor snippet for the thing you are building. + * @access public + */ + function generateConstructor($type, $fullClassName) { + $type = strtolower($type); + if ($type == 'model') { + return "ClassRegistry::init('$fullClassName');\n"; + } + if ($type == 'controller') { + $className = substr($fullClassName, 0, strlen($fullClassName) - 10); + return "new Test$fullClassName();\n\t\t\$this->{$className}->constructClasses();\n"; + } + return "new $fullClassName();\n"; + } + +/** + * Make the filename for the test case. resolve the suffixes for controllers + * and get the plugin path if needed. + * + * @param string $type The Type of object you are generating tests for eg. controller + * @param string $className the Classname of the class the test is being generated for. + * @return string filename the test should be created on. + * @access public + */ + function testCaseFileName($type, $className) { + $path = $this->getPath();; + $path .= 'cases' . DS . strtolower($type) . 's' . DS; + if (strtolower($type) == 'controller') { + $className = $this->getRealClassName($type, $className); + } + return $path . Inflector::underscore($className) . '.test.php'; + } + +/** + * Show help file. + * + * @return void + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake test "); + $this->hr(); + $this->out('Commands:'); + $this->out(""); + $this->out("test model post\n\tbakes a test case for the post model."); + $this->out(""); + $this->out("test controller comments\n\tbakes a test case for the comments controller."); + $this->out(""); + $this->out('Arguments:'); + $this->out("\t Can be any of the following 'controller', 'model', 'helper',\n\t'component', 'behavior'."); + $this->out("\t Any existing class for the chosen type."); + $this->out(""); + $this->out("Parameters:"); + $this->out("\t-plugin CamelCased name of plugin to bake tests for."); + $this->out(""); + $this->_stop(); + } +} diff --git a/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/view.php b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/view.php new file mode 100644 index 000000000..b9ff719d1 --- /dev/null +++ b/code/ryzom/tools/server/www/webtt/cake/console/libs/tasks/view.php @@ -0,0 +1,498 @@ +args)) { + $this->__interactive(); + } + if (empty($this->args[0])) { + return; + } + if (!isset($this->connection)) { + $this->connection = 'default'; + } + $controller = $action = $alias = null; + $this->controllerName = $this->_controllerName($this->args[0]); + $this->controllerPath = $this->_controllerPath($this->controllerName); + + $this->Project->interactive = false; + if (strtolower($this->args[0]) == 'all') { + return $this->all(); + } + + if (isset($this->args[1])) { + $this->template = $this->args[1]; + } + if (isset($this->args[2])) { + $action = $this->args[2]; + } + if (!$action) { + $action = $this->template; + } + if ($action) { + return $this->bake($action, true); + } + + $vars = $this->__loadController(); + $methods = $this->_methodsToBake(); + + foreach ($methods as $method) { + $content = $this->getContent($method, $vars); + if ($content) { + $this->bake($method, $content); + } + } + } + +/** + * Get a list of actions that can / should have views baked for them. + * + * @return array Array of action names that should be baked + */ + function _methodsToBake() { + $methods = array_diff( + array_map('strtolower', get_class_methods($this->controllerName . 'Controller')), + array_map('strtolower', get_class_methods('appcontroller')) + ); + $scaffoldActions = false; + if (empty($methods)) { + $scaffoldActions = true; + $methods = $this->scaffoldActions; + } + $adminRoute = $this->Project->getPrefix(); + foreach ($methods as $i => $method) { + if ($adminRoute && isset($this->params['admin'])) { + if ($scaffoldActions) { + $methods[$i] = $adminRoute . $method; + continue; + } elseif (strpos($method, $adminRoute) === false) { + unset($methods[$i]); + } + } + if ($method[0] === '_' || $method == strtolower($this->controllerName . 'Controller')) { + unset($methods[$i]); + } + } + return $methods; + } + +/** + * Bake All views for All controllers. + * + * @return void + */ + function all() { + $this->Controller->interactive = false; + $tables = $this->Controller->listAll($this->connection, false); + + $actions = null; + if (isset($this->args[1])) { + $actions = array($this->args[1]); + } + $this->interactive = false; + foreach ($tables as $table) { + $model = $this->_modelName($table); + $this->controllerName = $this->_controllerName($model); + $this->controllerPath = Inflector::underscore($this->controllerName); + if (App::import('Model', $model)) { + $vars = $this->__loadController(); + if (!$actions) { + $actions = $this->_methodsToBake(); + } + $this->bakeActions($actions, $vars); + $actions = null; + } + } + } + +/** + * Handles interactive baking + * + * @access private + */ + function __interactive() { + $this->hr(); + $this->out(sprintf("Bake View\nPath: %s", $this->path)); + $this->hr(); + + $this->DbConfig->interactive = $this->Controller->interactive = $this->interactive = true; + + if (empty($this->connection)) { + $this->connection = $this->DbConfig->getConfig(); + } + + $this->Controller->connection = $this->connection; + $this->controllerName = $this->Controller->getName(); + + $this->controllerPath = strtolower(Inflector::underscore($this->controllerName)); + + $prompt = sprintf(__("Would you like bake to build your views interactively?\nWarning: Choosing no will overwrite %s views if it exist.", true), $this->controllerName); + $interactive = $this->in($prompt, array('y', 'n'), 'y'); + + if (strtolower($interactive) == 'n') { + $this->interactive = false; + } + + $prompt = __("Would you like to create some CRUD views\n(index, add, view, edit) for this controller?\nNOTE: Before doing so, you'll need to create your controller\nand model classes (including associated models).", true); + $wannaDoScaffold = $this->in($prompt, array('y','n'), 'y'); + + $wannaDoAdmin = $this->in(__("Would you like to create the views for admin routing?", true), array('y','n'), 'y'); + + if (strtolower($wannaDoScaffold) == 'y' || strtolower($wannaDoAdmin) == 'y') { + $vars = $this->__loadController(); + if (strtolower($wannaDoScaffold) == 'y') { + $actions = $this->scaffoldActions; + $vars['scaffoldPrefix'] = null; + $this->bakeActions($actions, $vars); + } + if (strtolower($wannaDoAdmin) == 'y') { + $admin = $this->Project->getPrefix(); + $regularActions = $this->scaffoldActions; + $adminActions = array(); + foreach ($regularActions as $action) { + $adminActions[] = $admin . $action; + } + $vars['scaffoldPrefix'] = $admin; + $this->bakeActions($adminActions, $vars); + } + $this->hr(); + $this->out(); + $this->out(__("View Scaffolding Complete.\n", true)); + } else { + $this->customAction(); + } + } + +/** + * Loads Controller and sets variables for the template + * Available template variables + * 'modelClass', 'primaryKey', 'displayField', 'singularVar', 'pluralVar', + * 'singularHumanName', 'pluralHumanName', 'fields', 'foreignKeys', + * 'belongsTo', 'hasOne', 'hasMany', 'hasAndBelongsToMany' + * + * @return array Returns an variables to be made available to a view template + * @access private + */ + function __loadController() { + if (!$this->controllerName) { + $this->err(__('Controller not found', true)); + } + + $import = $this->controllerName; + if ($this->plugin) { + $import = $this->plugin . '.' . $this->controllerName; + } + + if (!App::import('Controller', $import)) { + $file = $this->controllerPath . '_controller.php'; + $this->err(sprintf(__("The file '%s' could not be found.\nIn order to bake a view, you'll need to first create the controller.", true), $file)); + $this->_stop(); + } + $controllerClassName = $this->controllerName . 'Controller'; + $controllerObj =& new $controllerClassName(); + $controllerObj->plugin = $this->plugin; + $controllerObj->constructClasses(); + $modelClass = $controllerObj->modelClass; + $modelObj =& $controllerObj->{$controllerObj->modelClass}; + + if ($modelObj) { + $primaryKey = $modelObj->primaryKey; + $displayField = $modelObj->displayField; + $singularVar = Inflector::variable($modelClass); + $singularHumanName = $this->_singularHumanName($this->controllerName); + $schema = $modelObj->schema(true); + $fields = array_keys($schema); + $associations = $this->__associations($modelObj); + $scaffoldForbiddenActions = $modelObj->scaffoldForbiddenActions; + } else { + $primaryKey = $displayField = null; + $singularVar = Inflector::variable(Inflector::singularize($this->controllerName)); + $singularHumanName = $this->_singularHumanName($this->controllerName); + $fields = $schema = $associations = array(); + } + $controllerMethods = get_class_methods($controllerClassName); + + $pluralVar = Inflector::variable($this->controllerName); + $pluralHumanName = $this->_pluralHumanName($this->controllerName); + + return compact('modelClass', 'schema', 'primaryKey', 'displayField', 'singularVar', 'pluralVar', + 'singularHumanName', 'pluralHumanName', 'fields','associations', 'scaffoldForbiddenActions'); + } + +/** + * Bake a view file for each of the supplied actions + * + * @param array $actions Array of actions to make files for. + * @return void + */ + function bakeActions($actions, $vars) { + foreach ($actions as $action) { + $content = $this->getContent($action, $vars); + $this->bake($action, $content); + } + } + +/** + * handle creation of baking a custom action view file + * + * @return void + */ + function customAction() { + $action = ''; + while ($action == '') { + $action = $this->in(__('Action Name? (use lowercase_underscored function name)', true)); + if ($action == '') { + $this->out(__('The action name you supplied was empty. Please try again.', true)); + } + } + $this->out(); + $this->hr(); + $this->out(__('The following view will be created:', true)); + $this->hr(); + $this->out(sprintf(__('Controller Name: %s', true), $this->controllerName)); + $this->out(sprintf(__('Action Name: %s', true), $action)); + $this->out(sprintf(__('Path: %s', true), $this->params['app'] . DS . $this->controllerPath . DS . Inflector::underscore($action) . ".ctp")); + $this->hr(); + $looksGood = $this->in(__('Look okay?', true), array('y','n'), 'y'); + if (strtolower($looksGood) == 'y') { + $this->bake($action); + $this->_stop(); + } else { + $this->out(__('Bake Aborted.', true)); + } + } + +/** + * Assembles and writes bakes the view file. + * + * @param string $action Action to bake + * @param string $content Content to write + * @return boolean Success + * @access public + */ + function bake($action, $content = '') { + if ($content === true) { + $content = $this->getContent($action); + } + if (empty($content)) { + return false; + } + $path = $this->getPath(); + $filename = $path . $this->controllerPath . DS . Inflector::underscore($action) . '.ctp'; + return $this->createFile($filename, $content); + } + +/** + * Builds content from template and variables + * + * @param string $action name to generate content to + * @param array $vars passed for use in templates + * @return string content from template + * @access public + */ + function getContent($action, $vars = null) { + if (!$vars) { + $vars = $this->__loadController(); + } + + $this->Template->set('action', $action); + $this->Template->set('plugin', $this->plugin); + $this->Template->set($vars); + $template = $this->getTemplate($action); + if ($template) { + return $this->Template->generate('views', $template); + } + return false; + } + +/** + * Gets the template name based on the action name + * + * @param string $action name + * @return string template name + * @access public + */ + function getTemplate($action) { + if ($action != $this->template && in_array($action, $this->noTemplateActions)) { + return false; + } + if (!empty($this->template) && $action != $this->template) { + return $this->template; + } + $template = $action; + $prefixes = Configure::read('Routing.prefixes'); + foreach ((array)$prefixes as $prefix) { + if (strpos($template, $prefix) !== false) { + $template = str_replace($prefix . '_', '', $template); + } + } + if (in_array($template, array('add', 'edit'))) { + $template = 'form'; + } elseif (preg_match('@(_add|_edit)$@', $template)) { + $template = str_replace(array('_add', '_edit'), '_form', $template); + } + return $template; + } + +/** + * Displays help contents + * + * @access public + */ + function help() { + $this->hr(); + $this->out("Usage: cake bake view ..."); + $this->hr(); + $this->out('Arguments:'); + $this->out(); + $this->out(""); + $this->out("\tName of the controller views to bake. Can use Plugin.name"); + $this->out("\tas a shortcut for plugin baking."); + $this->out(); + $this->out(""); + $this->out("\tName of the action view to bake"); + $this->out(); + $this->out('Commands:'); + $this->out(); + $this->out("view "); + $this->out("\tWill read the given controller for methods"); + $this->out("\tand bake corresponding views."); + $this->out("\tUsing the -admin flag will only bake views for actions"); + $this->out("\tthat begin with Routing.admin."); + $this->out("\tIf var scaffold is found it will bake the CRUD actions"); + $this->out("\t(index,view,add,edit)"); + $this->out(); + $this->out("view "); + $this->out("\tWill bake a template. core templates: (index, add, edit, view)"); + $this->out(); + $this->out("view